<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>scyzoryk</title><link href="https://scyzoryk.fubar.pl/" rel="alternate"></link><link href="https://scyzoryk.fubar.pl/feeds/all.atom.xml" rel="self"></link><id>https://scyzoryk.fubar.pl/</id><updated>2026-04-10T21:48:00+02:00</updated><entry><title>Sztuczniaki zrobiły mi terminal</title><link href="https://scyzoryk.fubar.pl/sztuczniaki-zrobily-mi-terminal.html" rel="alternate"></link><published>2026-04-10T21:48:00+02:00</published><updated>2026-04-10T21:48:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-04-10:/sztuczniaki-zrobily-mi-terminal.html</id><summary type="html">&lt;p&gt;Jakiś rok temu kupiłem używanego Remarkable2 (RM2) - tablet z ekranem e-ink. Naprawdę fajny komputerek.&lt;/p&gt;
&lt;p&gt;Dostałem do niego oryginalną klawiaturę Folio, a że RM2 jest hackowalny z difoltu to go oczywiście zjailbreakowałem i między innymi zainstalowałem emulator terminala: Yaft.&lt;/p&gt;
&lt;p&gt;Problem w tym, że Yaft ma, jak dla mnie, zbyt małe literki …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jakiś rok temu kupiłem używanego Remarkable2 (RM2) - tablet z ekranem e-ink. Naprawdę fajny komputerek.&lt;/p&gt;
&lt;p&gt;Dostałem do niego oryginalną klawiaturę Folio, a że RM2 jest hackowalny z difoltu to go oczywiście zjailbreakowałem i między innymi zainstalowałem emulator terminala: Yaft.&lt;/p&gt;
&lt;p&gt;Problem w tym, że Yaft ma, jak dla mnie, zbyt małe literki oraz brak polskich znaków diakrytycznych. Deweloper ustawił fonty na stałe ale zostawił dość enigmatyczną instrukcję jak sobie podmienić fonty.&lt;/p&gt;
&lt;p&gt;Spróbowałem ale pokonały mnie trudności tzw. obiektywne. Bo firmware mam zbyt stary, bo jailbreak na nowym nie działa, itd. więc wygrzebanie działającej cross-kompilacji trwało na tyle długo i było tak bardzo męczące, że już mi się odechciało grzebać.&lt;/p&gt;
&lt;p&gt;Zaraz... cross-kompilacja mi wychodziła, font sobie generowałem ale nie chciało mi się już zagłębiać dlaczego wywala mi się na fontach bold. Dałem w końcu temu wyraz w &lt;a class="reference external" href="https://github.com/timower/rM2-stuff/issues/34"&gt;Issues w oryginalnym repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No, ale w końcu, po paru miesiącach, chciałem sprawdzić czy z problemem poradzi sobie Claude od Anthropica.&lt;/p&gt;
&lt;p&gt;I dał radę ale trwało to kilka godzin, miał chyba więcej problemów z cross-kompilacją niż ja, aż w końcu mu zadziałała.&lt;/p&gt;
&lt;p&gt;Zużył prawie cały tygodniowy zapas tokenów plus dodatkowe 9 dolarów ale warto było.&lt;/p&gt;
&lt;p&gt;Wrzuciłem całość na &lt;a class="reference external" href="https://github.com/bitounu/rM2-stuff"&gt;forka w Githubie&lt;/a&gt;. W README jest opis.&lt;/p&gt;
&lt;p&gt;Jest nawet gotowy skrypt, wystarczy go uruchomić i pięknie skompiluje kilka wersji Yafta, z różnymi fontami.&lt;/p&gt;
&lt;p&gt;A tak to wygląda:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/uploads/2026/04/rm2-terminal1.jpeg" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image2" src="/uploads/2026/04/rm2-terminal2.jpeg" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
</content><category term="AI"></category></entry><entry><title>Dreame L10 Pro - problem z wnetylatorem, spalony bezpiecznik</title><link href="https://scyzoryk.fubar.pl/dreame_l10_pro_fix.html" rel="alternate"></link><published>2026-03-16T20:07:00+01:00</published><updated>2026-03-16T20:07:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-03-16:/dreame_l10_pro_fix.html</id><summary type="html">&lt;p&gt;Wrzucam, żeby pomóc innym.&lt;/p&gt;
&lt;p&gt;Robot Dreame L10 Pro rozpoczął sekwencję czyszczenia i nagle przerwał z komunikatem: "fan speed abnormal".&lt;/p&gt;
&lt;p&gt;Każda próba uruchomienia kończyła się po pozycjonowaniu, przed włączeniem głównego wentylatora.&lt;/p&gt;
&lt;p&gt;Po wymianie wentylatora na nowy, błąd nadal występował.&lt;/p&gt;
&lt;p&gt;Sprawdziłem bezpiecznik, który ktoś wskazał na innym forum  i był spalony, bez …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wrzucam, żeby pomóc innym.&lt;/p&gt;
&lt;p&gt;Robot Dreame L10 Pro rozpoczął sekwencję czyszczenia i nagle przerwał z komunikatem: "fan speed abnormal".&lt;/p&gt;
&lt;p&gt;Każda próba uruchomienia kończyła się po pozycjonowaniu, przed włączeniem głównego wentylatora.&lt;/p&gt;
&lt;p&gt;Po wymianie wentylatora na nowy, błąd nadal występował.&lt;/p&gt;
&lt;p&gt;Sprawdziłem bezpiecznik, który ktoś wskazał na innym forum  i był spalony, bez przejścia. Bezpiecznik na płycie jest koloru niebieskiego i oznaczony symbolem &lt;strong&gt;F5&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Kupiłem następujący bezpiecznik: &lt;strong&gt;SMD 0603 1,5A/63V (H) /4708&lt;/strong&gt; - wystarczyłby 32V ale nie takiego znalazłem.&lt;/p&gt;
&lt;p&gt;Wylutowałem stary, próbowałem gorącym powietrzem ale nie udało się, w końcu udało się kolbą. Trzeba być ostrożnym bo obok bezpiecznika jestr sporo jeszcze mniejszych elementów.&lt;/p&gt;
&lt;p&gt;Po wlutowaniu nowego bezpiecznika robot działa idealnie.&lt;/p&gt;
&lt;p&gt;Piszę to już po pełnym sprzątaniu domu.&lt;/p&gt;
&lt;p&gt;Załączam zdjęcia na których widać bezpiecznik na płycie.&lt;/p&gt;
&lt;p&gt;Aha, mam wgrane Valetudo i polecam gorąco, używam do ponad roku i moje dane nie wylatują do Chin.&lt;/p&gt;
&lt;p&gt;Jakby co to mam wykonaną płytkę do wgrywania softu, bez utraty gwarancji, mogę pożyczyć.&lt;/p&gt;
&lt;div class="section" id="lutowanie"&gt;
&lt;h2&gt;Lutowanie&lt;/h2&gt;
&lt;p&gt;Lutowanie nie jest tak trudne na jakie wygląda. Użyłem lutownicy &lt;a class="reference external" href="https://pine64.com/product/pinecil-smart-mini-portable-soldering-iron/"&gt;PINECIL&lt;/a&gt; i dużej ilości topnika w płynie. &lt;strong&gt;Nawet nie próbuj wylutowwyania/wlutowywania bez topnika!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Po usunięciu starego bezpiecznika, nałóż flux na pola lutownicze i z pomocą rozgrzanej lutownicy nanieś na każde z nich niewielką ilość cyny. Następnie z pomocą pęsety ułuż na miejscu nowy bezpiecznik i rozgrzej
kolejno oba końce. Nie rób tego zbyt długo aby nie dopuścić do przegrzania.&lt;/p&gt;
&lt;p&gt;Jeśli nie masz wprawy potrenuj najpierw na jakiejś starej, niepotrzebnej
elektronice.&lt;/p&gt;
&lt;p&gt;Bardzo przydatne przy tej pracy jest dobre oświetlenie i szkło powiększające.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2026/03/dreame01.jpg"&gt;&lt;img alt="image1" src="/uploads/2026/03/dreame01.jpg" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2026/03/dreame02.jpg"&gt;&lt;img alt="image2" src="/uploads/2026/03/dreame02.jpg" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Naprawa"></category><category term="robots"></category><category term="sprzęt"></category><category term="vaccum cleaner"></category></entry><entry><title>Dreame L10 Pro - vaccum robot fan problem, blown fuse</title><link href="https://scyzoryk.fubar.pl/dreame_l10_pro_fix-en.html" rel="alternate"></link><published>2026-03-16T20:07:00+01:00</published><updated>2026-03-16T20:07:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-03-16:/dreame_l10_pro_fix-en.html</id><summary type="html">&lt;p&gt;Posting this in case it helps others.&lt;/p&gt;
&lt;p&gt;My Dreame L10 Pro robot started its cleaning sequence and suddenly stopped with the message: "fan speed abnormal".&lt;/p&gt;
&lt;p&gt;Every attempt to start it ended right after positioning, before the main fan was turned on.&lt;/p&gt;
&lt;p&gt;Even after replacing the fan with a new one …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Posting this in case it helps others.&lt;/p&gt;
&lt;p&gt;My Dreame L10 Pro robot started its cleaning sequence and suddenly stopped with the message: "fan speed abnormal".&lt;/p&gt;
&lt;p&gt;Every attempt to start it ended right after positioning, before the main fan was turned on.&lt;/p&gt;
&lt;p&gt;Even after replacing the fan with a new one, the error was still there.&lt;/p&gt;
&lt;p&gt;I checked the fuse that someone had pointed out on another forum, and it was blown with no continuity. The fuse on the board is blue and marked &lt;strong&gt;F5&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I bought the following fuse: &lt;strong&gt;SMD 0603 1.5A/63V (H) /4708&lt;/strong&gt;. A 32V one would also have been enough, but I could not find one.&lt;/p&gt;
&lt;p&gt;I desoldered the old one. I first tried with hot air, but that did not work, and in the end I managed it with a soldering iron. You need to be careful, because there are many even smaller components right next to the fuse.&lt;/p&gt;
&lt;p&gt;After soldering in the new fuse, the robot works perfectly.&lt;/p&gt;
&lt;p&gt;I am writing this after a full house cleaning cycle.&lt;/p&gt;
&lt;p&gt;I am attaching photos where the fuse on the board is visible.&lt;/p&gt;
&lt;p&gt;One more thing: I have Valetudo installed and highly recommend it. I have been using it for over a year, and my data is not being sent to China.&lt;/p&gt;
&lt;div class="section" id="soldering"&gt;
&lt;h2&gt;Soldering&lt;/h2&gt;
&lt;p&gt;Soldering is not as hard as it might look. I used &lt;a class="reference external" href="https://pine64.com/product/pinecil-smart-mini-portable-soldering-iron/"&gt;PINECIL&lt;/a&gt; soldering iron and a lot of soldering flux. &lt;strong&gt;Do not even try to desolder and solder without it!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After removing the old fuse, apply flux to the solder pads and use a heated soldering iron to put a small amount of solder on each of them. Then place the new fuse in position with tweezers and heat both ends one after the other. Do not do this for too long, to avoid overheating.&lt;/p&gt;
&lt;p&gt;If you are not experienced, practice first on some old, disposable electronics.&lt;/p&gt;
&lt;p&gt;Good lighting and a magnifying glass are very helpful for this kind of work.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2026/03/dreame01.jpg"&gt;&lt;img alt="image1" src="/uploads/2026/03/dreame01.jpg" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2026/03/dreame02.jpg"&gt;&lt;img alt="image2" src="/uploads/2026/03/dreame02.jpg" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Naprawa"></category><category term="robots"></category><category term="sprzęt"></category><category term="vaccum cleaner"></category></entry><entry><title>Gitea z actions w Dockerze</title><link href="https://scyzoryk.fubar.pl/gitea-z-actions-w-dockerze.html" rel="alternate"></link><published>2026-03-07T00:29:00+01:00</published><updated>2026-03-07T00:29:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-03-07:/gitea-z-actions-w-dockerze.html</id><content type="html">&lt;p&gt;A tu coś będzie ale na razie to tylko test.&lt;/p&gt;
</content><category term="Administracja"></category><category term="linux"></category><category term="docker"></category><category term="gitea"></category></entry><entry><title>Tricki z fzf</title><link href="https://scyzoryk.fubar.pl/tricki-z-fzf.html" rel="alternate"></link><published>2026-03-05T22:24:00+01:00</published><updated>2026-03-05T22:24:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-03-05:/tricki-z-fzf.html</id><summary type="html">&lt;p&gt;Zanotujmy sobie kilka przydatnych tricków z &lt;strong&gt;fzf&lt;/strong&gt; i innymi narzędziami.&lt;/p&gt;
&lt;p&gt;Używam Arch Linux więc na początek instalacja narządków:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;fzf&lt;span class="w"&gt; &lt;/span&gt;fd&lt;span class="w"&gt; &lt;/span&gt;ripgrep&lt;span class="w"&gt; &lt;/span&gt;bat&lt;span class="w"&gt; &lt;/span&gt;zoxide&lt;span class="w"&gt; &lt;/span&gt;atuin&lt;span class="w"&gt; &lt;/span&gt;less&lt;span class="w"&gt; &lt;/span&gt;man-db
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Niektóre narzędzia trzeba zainicjować:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;zoxide&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;zsh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;atuin&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;zsh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/share/fzf/key-bindings.zsh
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Uwaga z ostatnim …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Zanotujmy sobie kilka przydatnych tricków z &lt;strong&gt;fzf&lt;/strong&gt; i innymi narzędziami.&lt;/p&gt;
&lt;p&gt;Używam Arch Linux więc na początek instalacja narządków:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pacman&lt;span class="w"&gt; &lt;/span&gt;-S&lt;span class="w"&gt; &lt;/span&gt;fzf&lt;span class="w"&gt; &lt;/span&gt;fd&lt;span class="w"&gt; &lt;/span&gt;ripgrep&lt;span class="w"&gt; &lt;/span&gt;bat&lt;span class="w"&gt; &lt;/span&gt;zoxide&lt;span class="w"&gt; &lt;/span&gt;atuin&lt;span class="w"&gt; &lt;/span&gt;less&lt;span class="w"&gt; &lt;/span&gt;man-db
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Niektóre narzędzia trzeba zainicjować:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;zoxide&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;zsh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;atuin&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;zsh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/share/fzf/key-bindings.zsh
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Uwaga z ostatnim includem, może przykryć skróty klawiszowe używane z Atuinem.&lt;/p&gt;
&lt;p&gt;Wczytanie konfiguracji:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.zshrc
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="aliasy"&gt;
&lt;h2&gt;Aliasy&lt;/h2&gt;
&lt;p&gt;Wyszukiwanie pliku z podglądem w prawej części terminala:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"fd --type f | fzf --preview 'bat --style=numbers --color=always {}' --preview-window=right:60%"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;a tu otwarcie w edytorze:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"fd --type f | fzf --preview 'bat --style=numbers --color=always {}' | xargs vim"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2026/03/alias-ff.png"&gt;&lt;img alt="image1" src="/uploads/2026/03/alias-ff.png" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Przeszukiwanie kodu, możesz np. wyszukać konkretną funkcję:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"fzf --bind 'change:reload:rg --line-number --no-heading {q} || true' --delimiter : --preview 'bat --color=always {1} --highlight-line {2}'"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2026/03/alias-fff.png"&gt;&lt;img alt="image2" src="/uploads/2026/03/alias-fff.png" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Przełączanie gałęzi w git-cie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;branch&lt;span class="w"&gt; &lt;/span&gt;--all&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fzf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/.* //'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;checkout
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Zabijanie procesów:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;-ef&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fzf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;kill&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Przeglądanie plików z podglądem:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;fzf&lt;span class="w"&gt; &lt;/span&gt;--preview&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'bat --style=numbers --color=always {}'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Fuzzy search po katalogach, które już odwiedzałem, dobre ale dopiero po zebraniu odpowiedniej liczby shortcutów:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;zz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'zoxide query -l | fzf | xargs cd'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Szybkie przechodzenie do folderu (przeszukanie zawsze zaczynam od $HOME):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;cdf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'cd ~;cd "$(fd --type d | fzf)"'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="hack"></category><category term="hack"></category><category term="fzf"></category><category term="linux"></category></entry><entry><title>Soft na Remarklable 2</title><link href="https://scyzoryk.fubar.pl/soft-na-remarkable2.html" rel="alternate"></link><published>2026-03-04T22:33:00+01:00</published><updated>2026-03-04T22:33:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-03-04:/soft-na-remarkable2.html</id><summary type="html">&lt;p&gt;Wziąłem się na nowo za notatnik Remarkable 2. Rysuję, mam trochę notatek, myślałem że użyję na nim Wireguarda ale niestety brak wsparcia w kernelu. Nie zamierza spędzać czasu na próbie skompilowania kernela bo nie znam architektury i w dodatku to jest jednak dość zamknięty system i podmiana kernela to raczej …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wziąłem się na nowo za notatnik Remarkable 2. Rysuję, mam trochę notatek, myślałem że użyję na nim Wireguarda ale niestety brak wsparcia w kernelu. Nie zamierza spędzać czasu na próbie skompilowania kernela bo nie znam architektury i w dodatku to jest jednak dość zamknięty system i podmiana kernela to raczej update firmware'u. Szkoda mi na to czasu.&lt;/p&gt;
&lt;p&gt;Postanowiłem za to sprawdzić czy się coś nowego nie pojawiło. Ot, gadżeciarstwo może ale jakie przyjemne. :)&lt;/p&gt;
&lt;p&gt;Pierwsz rzecz to &lt;a class="reference external" href="https://github.com/wowitsjack/freeMarkable"&gt;nowy rodzaj jailbreaku&lt;/a&gt; o niewyszukanej nazwie freeMarkable. Wygląda naprawdę obiecująco. Nie wiem czy jest XOVI, które jest instalowane ale się dowiem.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/fenollp/reMarkable-tools"&gt;remarkable tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/felipe-mapa/ephemeris-remarkable-calendar"&gt;generowany kalendarz&lt;/a&gt;, który można zautomatyzować, np. pobierać z Nextcloud (chyba, do sprawdzenia)&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Samarkin/rm-hacks-xovi-qmd?tab=readme-ov-file"&gt;rozszerzenia do XOVI&lt;/a&gt; - czym jest XOVI?&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Jayy001/codexctl"&gt;manager firmware'u&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Penguin-Guru/remarkable-api"&gt;Bash script do interakcji z API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/alvesvaren/rm-pad"&gt;RM2 jako tablet graficzny dla Waylanda&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/ranjuramesh/quill"&gt;czytnik PDF z adnotacjami&lt;/a&gt;  - w trakcie rozwoju&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/asivery/appload-rmstream"&gt;apka do streamowania ekranu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/asivery/xovi"&gt;XOVI - do pisania rozszerzeń aplikacji&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/vellum-dev/vellum"&gt;Vellum - nowy manadżer pakietów&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://vellum.delivery/"&gt;Lista pakietów Vellum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/rmitchellscott/xovi-tripletap"&gt;włączanie XOVI 3-wciśnięciem powera&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/rmitchellscott/Ephemeris"&gt;aktualizacja kalendarzy ICS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/rmitchellscott/reManager"&gt;manadżer modyfikacji&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/questr-hub/rmfeeder-rs"&gt;czytnik news i nie tylko&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/rmitchellscott/xovi-qmd-extensions"&gt;zestaw rozszerzeń XOVI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/reHackable/awesome-reMarkable"&gt;lista narzędzi dla RM2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/sambt94/remarkable-mcp"&gt;serwer MCP dający Claudowi (LLM) dostęp do plików na RM2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Vibhu9520/rm-hacks-qmd"&gt;małe tweaks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/ArMohadWaseem90/text2epub"&gt;konwersja TXT na ePUB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/dps/remarkable-keywriter"&gt;edytor Markdownu z klawiaturą po USB&lt;/a&gt; - nie działa mi z klawiaturą od RM2&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/rmkit-dev/rmkit"&gt;framework do budowania aplikacji&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/danielebruneo/remarkable2-hacks"&gt;opis hacków na RM2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/bordaigorl/rmview"&gt;prezentacja RM2 na ekranie komputera&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/GjjvdBurg/paper2remarkable"&gt;pobiera art. z arxiv i wrzuca na RM2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Evidlo/remarkable_news/tree/master"&gt;robi screena z gazety lub komiksu i wrzuca jako obrazek przy suspendzie&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/rien/reStream"&gt;streamuje ekran RM2 po SSH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Evidlo/remarkable_mouse"&gt;RM2 jako tablet do rysowania&lt;/a&gt;&lt;/p&gt;
</content><category term="hack"></category><category term="hack"></category><category term="remarkable"></category></entry><entry><title>Jak wymienić baterię w golarce Philips Oneblade</title><link href="https://scyzoryk.fubar.pl/ifixit_philips_oneblade.html" rel="alternate"></link><published>2026-02-25T18:50:00+01:00</published><updated>2026-02-25T18:50:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-02-25:/ifixit_philips_oneblade.html</id><summary type="html">&lt;p&gt;Zrobiłem poradnik dla iFixit "Jak wymienić baterię w golarce Philips Oneblade".&lt;/p&gt;
&lt;p&gt;Wkurzyło mnie, że golarka zaczęła słabo golić z powodu zużytej baterii.&lt;/p&gt;
&lt;p&gt;Ponownie wkurzyło mnie, że oryginalnie nie da się łatwo wymienić baterii.&lt;/p&gt;
&lt;p&gt;Trzeba było pomóc sobie i innym, stąd zatem poradnik.&lt;/p&gt;
&lt;p&gt;LINK: &lt;a class="reference external" href="https://www.ifixit.com/Guide/Philips+Norelco+OneBlade+Battery+Replacement/207814"&gt;iFixit Guide: Philips Norelco OneBlade Battery Replacement …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Zrobiłem poradnik dla iFixit "Jak wymienić baterię w golarce Philips Oneblade".&lt;/p&gt;
&lt;p&gt;Wkurzyło mnie, że golarka zaczęła słabo golić z powodu zużytej baterii.&lt;/p&gt;
&lt;p&gt;Ponownie wkurzyło mnie, że oryginalnie nie da się łatwo wymienić baterii.&lt;/p&gt;
&lt;p&gt;Trzeba było pomóc sobie i innym, stąd zatem poradnik.&lt;/p&gt;
&lt;p&gt;LINK: &lt;a class="reference external" href="https://www.ifixit.com/Guide/Philips+Norelco+OneBlade+Battery+Replacement/207814"&gt;iFixit Guide: Philips Norelco OneBlade Battery Replacement&lt;/a&gt;&lt;/p&gt;
</content><category term="Hack"></category><category term="hack"></category><category term="golarka"></category><category term="oneblade"></category><category term="philips"></category></entry><entry><title>Youtube bez reklam na TV Samsunga ale nie za darmo</title><link href="https://scyzoryk.fubar.pl/youtube_bez_reklam.html" rel="alternate"></link><published>2026-02-14T22:53:00+01:00</published><updated>2026-02-14T22:53:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-02-14:/youtube_bez_reklam.html</id><summary type="html">&lt;p&gt;Cel: wyłączyć reklamy w aplikacji YT zainstalowanej na Samsung TV.&lt;/p&gt;
&lt;div class="section" id="wymagania"&gt;
&lt;h2&gt;Wymagania:&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;konto w Surfshark VPN,&lt;/li&gt;
&lt;li&gt;router Mikrotik.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="konto-vpn-na-surfshark"&gt;
&lt;h2&gt;1. Konto VPN na Surfshark&lt;/h2&gt;
&lt;ol class="loweralpha simple"&gt;
&lt;li&gt;Po zalogowaniu na koncie Surfsharka wejdź w "VPN" -&amp;gt; "Konfiguracja ręczna" ("Manual setup").&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image01" src="/uploads/2026/02/ss01.png" style="width: 250px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="2"&gt;
&lt;li&gt;Znowu klikasz w "Konfiguruj ręcznie":&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image02" src="/uploads/2026/02/ss02.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="3"&gt;
&lt;li&gt;wybierasz protokół "Wireguard":&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image03" src="/uploads/2026/02/ss03.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="4"&gt;
&lt;li&gt;jeśli nie masz pary kluczy to...:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image04" src="/uploads/2026/02/ss04.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="5"&gt;
&lt;li&gt;generujesz nową …&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Cel: wyłączyć reklamy w aplikacji YT zainstalowanej na Samsung TV.&lt;/p&gt;
&lt;div class="section" id="wymagania"&gt;
&lt;h2&gt;Wymagania:&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;konto w Surfshark VPN,&lt;/li&gt;
&lt;li&gt;router Mikrotik.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="konto-vpn-na-surfshark"&gt;
&lt;h2&gt;1. Konto VPN na Surfshark&lt;/h2&gt;
&lt;ol class="loweralpha simple"&gt;
&lt;li&gt;Po zalogowaniu na koncie Surfsharka wejdź w "VPN" -&amp;gt; "Konfiguracja ręczna" ("Manual setup").&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image01" src="/uploads/2026/02/ss01.png" style="width: 250px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="2"&gt;
&lt;li&gt;Znowu klikasz w "Konfiguruj ręcznie":&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image02" src="/uploads/2026/02/ss02.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="3"&gt;
&lt;li&gt;wybierasz protokół "Wireguard":&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image03" src="/uploads/2026/02/ss03.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="4"&gt;
&lt;li&gt;jeśli nie masz pary kluczy to...:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image04" src="/uploads/2026/02/ss04.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="5"&gt;
&lt;li&gt;generujesz nową parę kluczy:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image05" src="/uploads/2026/02/ss05.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="6"&gt;
&lt;li&gt;jeśli już masz klucze (nowe lub stare) to wybierasz odpowiednią lokalizację:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image06" src="/uploads/2026/02/ss06.png" style="width: 500px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="7"&gt;
&lt;li&gt;i pobierasz pliki konfiguracji (ikona na samym dole):&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image07" src="/uploads/2026/02/ss07.png" style="width: 250px;"/&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="tunel-wireguard-na-mikrotiku"&gt;
&lt;h2&gt;2. Tunel Wireguard na Mikrotiku&lt;/h2&gt;
&lt;p&gt;Na Mikrotiku stwórz następującą konfigurację:&lt;/p&gt;
&lt;ol class="loweralpha simple"&gt;
&lt;li&gt;utwórz nowy interfejs dla Wireguarda&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image1" src="/uploads/2026/02/wg-ss01.png" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="2"&gt;
&lt;li&gt;gdy wrócisz do menu interfejsów i ponownie wybierzesz świeżo dodany interfejs...&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image2" src="/uploads/2026/02/wg-ss02.png" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="3"&gt;
&lt;li&gt;zobaczysz, że system automatycznie wygenerował klucze publiczny i prywatny&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image3" src="/uploads/2026/02/wg-ss03.png" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha" start="4"&gt;
&lt;li&gt;&lt;p class="first"&gt;wróć, przejdź na zakładkę "Peers" i dodaj nowego "peera".&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;w polu "Interface" wybierz świeżo dodany interfejs "wireguard-ss"&lt;/p&gt;
&lt;p&gt;w polu "Public key" wpisz klucz publiczny z konfiguracji Surfsharka&lt;/p&gt;
&lt;p&gt;w polu "Endpoint" wpisz to co w konfigu Surfsharka nazywa się "Adres serwera"&lt;/p&gt;
&lt;p&gt;w polu "Endpoint port" port jaki znajdziesz w pobranym pliku konfiguracji&lt;/p&gt;
&lt;p&gt;zachowaj wprowadzone zmiany&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image4" src="/uploads/2026/02/wg-ss04.png" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="5"&gt;
&lt;li&gt;w menu IP -&amp;gt; Addresses zobaczysz...&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image5" src="/uploads/2026/02/wg-ss05.png" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;ol class="loweralpha simple" start="6"&gt;
&lt;li&gt;że interfejs dostał adres IP (z tej podsieci jaką masz w pliku konfiguracji Surfsharka), tunel już powinien działać&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image6" src="/uploads/2026/02/wg-ss06.png" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;p&gt;Wszystko co powyżej możesz zrobić w shellu Mikrotika poniższymi komendami:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;/interface/wireguard&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;wireguard-ss&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mtu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1420&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;private-key&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;private_key&amp;gt;"&lt;/span&gt;

/ip/address&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;adres&lt;span class="w"&gt; &lt;/span&gt;VPN&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;konfigu&lt;span class="w"&gt; &lt;/span&gt;Surfsharka&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;wireguard-ss

/interface/wireguard/peers&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;wireguard-ss&lt;span class="w"&gt; &lt;/span&gt;public-key&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;klucz publiczny z konfigur Surfsharka&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;endpoint-address&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;&lt;span class="s2"&gt;"Adres serwera"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;konfigu&lt;span class="w"&gt; &lt;/span&gt;Surfsharka&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;endpoint-port&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;port&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;konfigu&lt;span class="w"&gt; &lt;/span&gt;Surfsharka&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;allowed-address&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0.0.0/0&lt;span class="w"&gt; &lt;/span&gt;persistent-keepalive&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="podpiecie-telewizora"&gt;
&lt;h2&gt;3. Podpięcie telewizora&lt;/h2&gt;
&lt;p&gt;Dodaj regułę przed innymi srcnat (kolejność ma znaczenie):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;/ip/firewall/nat&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;srcnat&lt;span class="w"&gt; &lt;/span&gt;src-address&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;IP&lt;span class="w"&gt; &lt;/span&gt;telewizora&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;out-interface&lt;span class="o"&gt;=&lt;/span&gt;wireguard-ss&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;masquerade&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TV -&amp;gt; NAT via WireGuard"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Osobna tablica routingu tylko dla TV + default route przez WG:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;/routing/table&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;to-wg&lt;span class="w"&gt; &lt;/span&gt;fib

/ip/route&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;dst-address&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.0.0.0/0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;wireguard-ss&lt;span class="w"&gt; &lt;/span&gt;routing-table&lt;span class="o"&gt;=&lt;/span&gt;to-wg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TV default route via WG"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Oznacz (policy route) ruch TV do tablicy &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;to-wg&lt;/span&gt;&lt;/tt&gt; (Użyj mangle w prerouting, żeby oznaczyć ruch z TV.
Ważne: wyklucz lokalne cele (router/LAN), żeby TV nadal gadało z routerem w LAN):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;/ip/firewall/mangle&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prerouting&lt;span class="w"&gt; &lt;/span&gt;src-address&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;IP&lt;span class="w"&gt; &lt;/span&gt;telewizora&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;dst-address-type&lt;span class="o"&gt;=&lt;/span&gt;!local&lt;span class="w"&gt; &lt;/span&gt;dst-address&lt;span class="o"&gt;=&lt;/span&gt;!&amp;lt;adres&lt;span class="w"&gt; &lt;/span&gt;sieci&lt;span class="w"&gt; &lt;/span&gt;LAN&amp;gt;/24&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mark-routing&lt;span class="w"&gt; &lt;/span&gt;new-routing-mark&lt;span class="o"&gt;=&lt;/span&gt;to-wg&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;passthrough&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TV policy-route via WG (no local/LAN)"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Kill-switch: TV ma nie mieć prawa wyjść na WAN poza WG (nawet jeśli WG padnie, TV nie ma prawa wyjść przez interfejs z Internetem):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;/ip/firewall/filter&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;src-address&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;IP&lt;span class="w"&gt; &lt;/span&gt;telewizora&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;out-interface&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;nazwa&lt;span class="w"&gt; &lt;/span&gt;interfejsu&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;Internetem&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;drop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"KILL-SWITCH: block TV direct WAN"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="Hack"></category><category term="google"></category><category term="hack"></category><category term="vpn"></category><category term="mikrotik"></category></entry><entry><title>Kindle Keyboard (3rd Generation, k3gb) JAILBREAK pl</title><link href="https://scyzoryk.fubar.pl/kindle_keyboard.html" rel="alternate"></link><published>2026-02-07T23:08:00+01:00</published><updated>2026-02-07T23:08:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-02-07:/kindle_keyboard.html</id><summary type="html">&lt;p&gt;Kindle Keyboard (3rd Generation) to model &lt;strong&gt;k3gb&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;UWAGA!!!
Dalsza część procedury zakłada, że numer seryjny Kindle zaczyna się od &lt;strong&gt;B00A&lt;/strong&gt;, bo mój egzemplarz ma numer seryjny zaczynający się od &lt;strong&gt;B00A&lt;/strong&gt;, co oznacza, że jest to
wersja &lt;strong&gt;k3gb&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sprawdź numer seryjny swojego Kindle (znajdziesz go na tylnej obudowie) i użyj odpowiednich …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kindle Keyboard (3rd Generation) to model &lt;strong&gt;k3gb&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;UWAGA!!!
Dalsza część procedury zakłada, że numer seryjny Kindle zaczyna się od &lt;strong&gt;B00A&lt;/strong&gt;, bo mój egzemplarz ma numer seryjny zaczynający się od &lt;strong&gt;B00A&lt;/strong&gt;, co oznacza, że jest to
wersja &lt;strong&gt;k3gb&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sprawdź numer seryjny swojego Kindle (znajdziesz go na tylnej obudowie) i użyj odpowiednich
plików! Przeczytaj instrukcję w pliku &lt;cite&gt;1-Jailbreak/README.txt&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Tutaj podaję istotne dane:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;k3g&lt;/strong&gt; oznacza K3 3G (US [B006]),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;k3w&lt;/strong&gt; oznacza K3 WiFi [B008],&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;k3gb&lt;/strong&gt; oznacza K3 3G (UK [B00A]).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Czyli plik &lt;tt class="docutils literal"&gt;Update_jailbreak_0.13.N_k3g_install.bin&lt;/tt&gt; to jailbreak dla Kindle z nr seryjnym
zaczynającym się od &lt;strong&gt;B006&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="admonition admonition-pobierz-archiwum-z-potrzebnymi-plikami"&gt;
&lt;p class="first admonition-title"&gt;Pobierz archiwum z potrzebnymi plikami&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/2026/02/Kindle-Keyboard-Jailbreak.tar.gz"&gt;Kindle-Keyboard-Jailbreak.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;i wypakuj:&lt;/p&gt;
&lt;div class="last"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;xvf&lt;span class="w"&gt; &lt;/span&gt;Kindle-Keyboard-Jailbreak.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Kindle-Keyboard-Jailbreak
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="section" id="aktualizacja-firmware-u"&gt;
&lt;h2&gt;0. Aktualizacja firmware'u&lt;/h2&gt;
&lt;p&gt;Znalazłem informację, że KUAL działa z nowym certyfikatem dopiero po
zaktualizowaniu firmware'u do wersji &lt;strong&gt;3.4.3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Miałem firmware &lt;strong&gt;3.2.1&lt;/strong&gt;, więc aby dojść do &lt;strong&gt;3.4.3&lt;/strong&gt;, musiałem instalować kolejne
wersje pośrednie.&lt;/p&gt;
&lt;p&gt;Aktualizację wykonujemy kolejno dla każdego pliku z katalogu
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0-update-firmware&lt;/span&gt;&lt;/tt&gt; w następującej kolejności:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update_kindle_3.3_B00A.bin&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update_kindle_3.4_B00A.bin&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update_kindle_3.4_3.4.2_B00A.bin&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Update_2687240004-3543620001.bin&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Schemat działania dla każdego pliku:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
cp 0-update-firmware/{kolejna_wersja}.bin /mnt/usb
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Na Kindle wybieram:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Settings&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;przycisk menu&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update Your Kindle&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Następuje aktualizacja i restart urządzenia. Po restarcie wykonuję te same kroki
dla kolejnego pliku, aż do osiągnięcia wersji &lt;strong&gt;3.4.3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Oficjalny opis procesu znajduje się tutaj:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.amazon.com/gp/help/customer/display.html?nodeId=GX3VVAQS4DYDE5KE#GUID-4C9EFFF2-2B4E-4DB8-997D-6DC9B3566220__SECTION_1CC4F0B2FB6A4697972BED2975384B60"&gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=GX3VVAQS4DYDE5KE#GUID-4C9EFFF2-2B4E-4DB8-997D-6DC9B3566220__SECTION_1CC4F0B2FB6A4697972BED2975384B60&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UWAGA – BARDZO WAŻNE!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NIE URUCHAMIAJ żadnej książki (pliku), która ma w nazwie słowo „TEST”.&lt;/strong&gt;
Jeżeli to zrobisz, będziesz musiał przechodzić cały proces od początku.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Najlepiej usuń ten plik natychmiast po zakończeniu aktualizacji firmware'u,
jeszcze przed wykonaniem jailbreaka.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="jailbreak"&gt;
&lt;h2&gt;1. Jailbreak&lt;/h2&gt;
&lt;p&gt;Plik jailbreaka:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update_jailbreak_0.13.N_k3gb_install.bin&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jest to wersja przeznaczona dla firmware'u &lt;strong&gt;3.4.3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Po podłączeniu Kindle przez USB skopiuj plik do katalogu głównego urządzenia:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
cp 1-Jailbreak/Update_jailbreak_0.13.N_k3gb_install.bin /mnt/usb
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Na Kindle wybierz:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Settings&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;przycisk menu&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update Your Kindle&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Proces jailbreaka trwa około 15 sekund.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="nowe-certyfikaty"&gt;
&lt;h2&gt;2. Nowe certyfikaty&lt;/h2&gt;
&lt;p&gt;Po restarcie skopiuj na Kindle nowe certyfikaty:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
sudo cp 2-DevCerts/Update-mkk-20250419-k3gb-B00A_keystore-install.bin /mnt/usb
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Odłącz kabel USB i ponownie wykonaj:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Settings&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;przycisk menu&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update Your Kindle&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="kual"&gt;
&lt;h2&gt;3. KUAL&lt;/h2&gt;
&lt;p&gt;Po restarcie skopiuj KUAL do katalogu &lt;tt class="docutils literal"&gt;documents&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
sudo cp KUAL-KDK-1.0.azw2 /mnt/usb/documents/
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Odłącz kabel USB i ponownie:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Settings&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;przycisk menu&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update Your Kindle&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Po restarcie KUAL powinien działać poprawnie.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="helper-extensions-do-kual-oraz-koreader"&gt;
&lt;h2&gt;4. Helper Extensions do KUAL oraz KOReader&lt;/h2&gt;
&lt;p&gt;Najpierw zainstaluj rozszerzenia do KUAL:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
sudo cp -r 4-Extensions/* /mnt/usb/
&lt;/pre&gt;
&lt;p&gt;Następnie KOReader:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo cp -r 5-Koreader/* /mnt/usb/
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Po uruchomieniu KUAL rozszerzenia powinny być widoczne.&lt;/p&gt;
&lt;p&gt;Pozostałe hacki instalujemy w zależności od ich formy:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;jako aktualizacje firmware'u (np. screensavery),&lt;/li&gt;
&lt;li&gt;jako pakiety instalowane przez KUAL (np. Gawk).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="Hack"></category><category term="kindle"></category><category term="jailbreak"></category><category term="hack"></category></entry><entry><title>Kindle Keyboard (3rd Generation, k3gb) JAILBREAK</title><link href="https://scyzoryk.fubar.pl/kindle_keyboard-en.html" rel="alternate"></link><published>2026-02-07T23:08:00+01:00</published><updated>2026-02-07T23:08:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2026-02-07:/kindle_keyboard-en.html</id><summary type="html">&lt;p&gt;Kindle Keyboard (3rd Generation) corresponds to the &lt;strong&gt;k3gb&lt;/strong&gt; model.&lt;/p&gt;
&lt;p&gt;WARNING!!!
The further part of this procedure assumes that the Kindle serial number starts with &lt;strong&gt;B00A&lt;/strong&gt;, because my device has a serial number starting with &lt;strong&gt;B00A&lt;/strong&gt;, which means it is the k3gb version.&lt;/p&gt;
&lt;p&gt;Check the serial number of your Kindle (you …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kindle Keyboard (3rd Generation) corresponds to the &lt;strong&gt;k3gb&lt;/strong&gt; model.&lt;/p&gt;
&lt;p&gt;WARNING!!!
The further part of this procedure assumes that the Kindle serial number starts with &lt;strong&gt;B00A&lt;/strong&gt;, because my device has a serial number starting with &lt;strong&gt;B00A&lt;/strong&gt;, which means it is the k3gb version.&lt;/p&gt;
&lt;p&gt;Check the serial number of your Kindle (you will find it on the back cover) and use the appropriate files! Read the instructions in the file &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;1-Jailbreak/README.txt&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Here I provide the relevant details:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;k3g&lt;/strong&gt; means K3 3G (US [B006]),&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;k3w&lt;/strong&gt; means K3 WiFi [B008],&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;k3gb&lt;/strong&gt; means K3 3G (UK [B00A]).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the file &lt;tt class="docutils literal"&gt;Update_jailbreak_0.13.N_k3g_install.bin&lt;/tt&gt; is the jailbreak for a Kindle with a serial number starting with &lt;strong&gt;B006&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="admonition admonition-download-archive-with-required-files"&gt;
&lt;p class="first admonition-title"&gt;Download archive with required files&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/uploads/2026/02/Kindle-Keyboard-Jailbreak.tar.gz"&gt;Kindle-Keyboard-Jailbreak.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and unpack with:&lt;/p&gt;
&lt;div class="last"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;tar&lt;span class="w"&gt; &lt;/span&gt;xvf&lt;span class="w"&gt; &lt;/span&gt;Kindle-Keyboard-Jailbreak.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Kindle-Keyboard-Jailbreak
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="section" id="firmware-update"&gt;
&lt;h2&gt;0. Firmware Update&lt;/h2&gt;
&lt;p&gt;I found information that KUAL works with the new certificate &lt;strong&gt;only after&lt;/strong&gt;
updating the firmware to version &lt;strong&gt;3.4.3&lt;/strong&gt;.
My device originally had &lt;strong&gt;3.2.1&lt;/strong&gt;, and to reach &lt;strong&gt;3.4.3&lt;/strong&gt; I had to install
the intermediate firmware versions sequentially.&lt;/p&gt;
&lt;p&gt;For each file from the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;0-update-firmware&lt;/span&gt;&lt;/tt&gt; directory, install them in the
following order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update_kindle_3.3_B00A.bin&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update_kindle_3.4_B00A.bin&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;Update_kindle_3.4_3.4.2_B00A.bin&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Update_2687240004-3543620001.bin&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sequence example:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
cp 0-update-firmware/{next_version}.bin /mnt/usb
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;From the Kindle menu, select &lt;strong&gt;Settings&lt;/strong&gt;, then press the menu button again and
choose &lt;strong&gt;Update Your Kindle&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The device will update, reboot, and then repeat the same steps with the next
file until version &lt;strong&gt;3.4.3&lt;/strong&gt; is reached.&lt;/p&gt;
&lt;p&gt;Official description:
&lt;a class="reference external" href="https://www.amazon.com/gp/help/customer/display.html?nodeId=GX3VVAQS4DYDE5KE#GUID-4C9EFFF2-2B4E-4DB8-997D-6DC9B3566220__SECTION_1CC4F0B2FB6A4697972BED2975384B60"&gt;https://www.amazon.com/gp/help/customer/display.html?nodeId=GX3VVAQS4DYDE5KE#GUID-4C9EFFF2-2B4E-4DB8-997D-6DC9B3566220__SECTION_1CC4F0B2FB6A4697972BED2975384B60&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT – READ CAREFULLY&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DO NOT OPEN ANY ITEM (BOOK) WITH "TEST" IN ITS NAME THAT APPEARS ON THE KINDLE.&lt;/strong&gt;
If you do, you will have to repeat the entire process from the beginning.&lt;/p&gt;
&lt;p&gt;It is best to delete this file immediately after completing this step and
&lt;strong&gt;before performing the jailbreak&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="jailbreak"&gt;
&lt;h2&gt;1. Jailbreak&lt;/h2&gt;
&lt;p&gt;The jailbreak file used is:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;Update_jailbreak_0.13.N_k3gb_install.bin&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;This is required because the firmware version is &lt;strong&gt;3.4.3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;After connecting the Kindle via USB, copy the file to the root directory:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
cp 1-Jailbreak/Update_jailbreak_0.13.N_k3gb_install.bin /mnt/usb
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;From the menu, select &lt;strong&gt;Settings&lt;/strong&gt;, then press the menu button again and choose
&lt;strong&gt;Update Your Kindle&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The jailbreak process takes approximately &lt;strong&gt;15 seconds&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="new-certificates"&gt;
&lt;h2&gt;2. New Certificates&lt;/h2&gt;
&lt;p&gt;After rebooting, copy the new certificates to the Kindle:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
sudo cp 2-DevCerts/Update-mkk-20250419-k3gb-B00A_keystore-install.bin /mnt/usb
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Disconnect the USB cable and, as before, select &lt;strong&gt;Settings&lt;/strong&gt;, then press the
menu button and choose &lt;strong&gt;Update Your Kindle&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="kual"&gt;
&lt;h2&gt;3. KUAL&lt;/h2&gt;
&lt;p&gt;After rebooting, copy KUAL to the Kindle:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
sudo cp KUAL-KDK-1.0.azw2 /mnt/usb/documents/
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Disconnect the USB cable and again select &lt;strong&gt;Settings&lt;/strong&gt;, then the menu button,
and &lt;strong&gt;Update Your Kindle&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;After rebooting, KUAL should be fully functional.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="kual-helper-extensions-and-koreader"&gt;
&lt;h2&gt;4. KUAL Helper Extensions and KOReader&lt;/h2&gt;
&lt;p&gt;First, install the KUAL extensions:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
sudo cp -r 4-Extensions/* /mnt/usb/
&lt;/pre&gt;
&lt;p&gt;Then install KOReader:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
sudo cp -r 5-Koreader/* /mnt/usb/
umount /mnt/usb
&lt;/pre&gt;
&lt;p&gt;After launching KUAL, the extensions should be visible.&lt;/p&gt;
&lt;p&gt;Additional hacks can be installed depending on their form:
some as update packages (e.g. screensavers),
others as KUAL packages (e.g. Gawk).&lt;/p&gt;
&lt;/div&gt;
</content><category term="Hack"></category><category term="kindle"></category><category term="jailbreak"></category><category term="hack"></category></entry><entry><title>Własna chmura dla Remarkable 2</title><link href="https://scyzoryk.fubar.pl/remarkable_rmfakecloud.html" rel="alternate"></link><published>2024-10-27T10:08:00+01:00</published><updated>2024-10-27T10:08:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2024-10-27:/remarkable_rmfakecloud.html</id><summary type="html">&lt;p&gt;Notatnik Remarkable jest świetnym urządzeniem ale do pełnego szczęścia wymaga (niestety) rejestracji w chmurze firmowej oraz opłacania comiesięcznej subskrybcji.&lt;/p&gt;
&lt;p&gt;Co daje subskrybcja?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Synchronizacja plików&lt;/li&gt;
&lt;li&gt;Integracje z zewnętrznymi źródłami plików (przy użyciu WebDAV lub dedykowanego katalogu w lokalnym systemie plików, zamiast Google Drive i Dropbox)&lt;/li&gt;
&lt;li&gt;Wysyłanie dokumentu przez e-mail&lt;/li&gt;
&lt;li&gt;Rozpoznawanie pisma …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Notatnik Remarkable jest świetnym urządzeniem ale do pełnego szczęścia wymaga (niestety) rejestracji w chmurze firmowej oraz opłacania comiesięcznej subskrybcji.&lt;/p&gt;
&lt;p&gt;Co daje subskrybcja?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Synchronizacja plików&lt;/li&gt;
&lt;li&gt;Integracje z zewnętrznymi źródłami plików (przy użyciu WebDAV lub dedykowanego katalogu w lokalnym systemie plików, zamiast Google Drive i Dropbox)&lt;/li&gt;
&lt;li&gt;Wysyłanie dokumentu przez e-mail&lt;/li&gt;
&lt;li&gt;Rozpoznawanie pisma ręcznego!!!&lt;/li&gt;
&lt;li&gt;Odblokowanie funkcji udostępniania ekranu (ale nie działa zdalnie, aplikacji należy używać przez USB)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Na szczęście, dzięki niezależnym deweloperom, można chmurę firmową zastąpić utrzymywaną na własnym serwerze.&lt;/p&gt;
&lt;p&gt;Proces jest trywialny w przypadku użycia Dockera, a pełna dokumentacja projektu dostępna jest tu: &lt;a class="reference external" href="https://ddvk.github.io/rmfakecloud/"&gt;rmfakecloud&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="instalacja-chmury"&gt;
&lt;h2&gt;Instalacja chmury&lt;/h2&gt;
&lt;p&gt;Na serwerze stwórz plik &lt;strong&gt;docker-compose.yml&lt;/strong&gt; z następującą zawartością:&lt;/p&gt;
&lt;pre class="code dockerfile literal-block"&gt;
services:&lt;span class="w"&gt;
  &lt;/span&gt;rmfakecloud:&lt;span class="w"&gt;
    &lt;/span&gt;image:&lt;span class="w"&gt; &lt;/span&gt;ddvk/rmfakecloud&lt;span class="w"&gt;
    &lt;/span&gt;container_name:&lt;span class="w"&gt; &lt;/span&gt;rmfakecloud&lt;span class="w"&gt;
    &lt;/span&gt;restart:&lt;span class="w"&gt; &lt;/span&gt;unless-stopped&lt;span class="w"&gt;
    &lt;/span&gt;env_file:&lt;span class="w"&gt;
      &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;env&lt;span class="w"&gt;
    &lt;/span&gt;volumes:&lt;span class="w"&gt;
      &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;./data:/data&lt;span class="w"&gt;
    &lt;/span&gt;ports:&lt;span class="w"&gt;
      &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3033:80"&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Stwórz też plik &lt;strong&gt;env&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;JWT_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;tu&lt;span class="w"&gt; &lt;/span&gt;wygenerowany&lt;span class="w"&gt; &lt;/span&gt;token&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;STORAGE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://rmfakecloud.example.com:3033&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;LOGLEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debug&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_LOGFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/data/log&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RMAPI_HWR_APPLICATIONKEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;klucz&lt;span class="w"&gt; &lt;/span&gt;API&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;myscript.com&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RMAPI_HWR_HMAC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;HMAC&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;myscript.com&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_SMTP_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mail.example.com:587&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_SMTP_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user@example.com&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_SMTP_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;hasło&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# RM_SMTP_FROM = niestandardowy nagłówek „From:” dla e-maili (np. Mój remarkable remarkable@rmfakecloud.example.com).
#                Jeśli to ustawienie jest włączone, adres e-mail użytkownika jest umieszczany w polu „Reply-To:”.
# RM_SMTP_HELO   Własne HELO, jeśli dostawca poczty tego wymaga
# RM_SMTP_NOTLS  Nie używaj TLS
# RM_SMTP_STARTTLS   Użyj polecenia STARTTLS, powinno być połączone z opcją NOTLS. W większości przypadków należy użyć portu 587.
# RM_SMTP_INSECURE_TLS Jeśli ustawione, nie sprawdzaj certyfikatu serwera (niezalecane).&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Token używany w zmiennej &lt;cite&gt;JWT_SECRET_KEY&lt;/cite&gt; można wygenerować tym poleceniem:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
openssl&lt;span class="w"&gt; &lt;/span&gt;rand&lt;span class="w"&gt; &lt;/span&gt;-base64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;48&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Zmienna &lt;cite&gt;STORAGE_URL&lt;/cite&gt; zawiera nazwę serwera i port pod którymi &lt;strong&gt;rmfakecloud&lt;/strong&gt; będzie dostępny, czyli FQDN twojego serwera, np.: &lt;cite&gt;http://rmfakecloud.example.com:3033&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Zmienne &lt;cite&gt;RMAPI_HWR_APPLICATIONKEY&lt;/cite&gt; oraz &lt;cite&gt;RMAPI_HWR_HMAC&lt;/cite&gt; zawierają odpowiednio, klucz API oraz HMAC wygenerowane na stronach &lt;cite&gt;francuskiej firmy MyScript [https://developer.myscript.com/]&lt;/cite&gt; i umożliwiają rozpoznawanie pisma odręcznego!!!&lt;/p&gt;
&lt;p&gt;Musisz, niestety, założyć konto w myscript.com ale w zamian masz 2000 darmowych konwersji miesięcznie.&lt;/p&gt;
&lt;p&gt;Po założeniu konta, tworzysz aplikację, dla której generowane są wspomniane wyżej zmienne &lt;cite&gt;RMAPI_HWR_APPLICATIONKEY&lt;/cite&gt; i &lt;cite&gt;RMAPI_HWR_HMAC&lt;/cite&gt;.
Poniżej dwa screeny z myscript.com:&lt;/p&gt;
&lt;img alt="Tworzenie aplikacji w myscript.com" src="/uploads/2024/10/rm_myscript01.png" style="width: 700px;"/&gt;
&lt;hr class="docutils"/&gt;
&lt;img alt="Klucze aplikacji w myscript.com" src="/uploads/2024/10/rm_myscript02.png" style="width: 700px;"/&gt;
&lt;p&gt;Reszta zmiennych dotyczy serwera e-mail i jest wystarczająco opisana.&lt;/p&gt;
&lt;p&gt;Gdy wszystko masz gotowe odpalasz &lt;strong&gt;rmfakecloud&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;compose&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;-d
&lt;/pre&gt;
&lt;p&gt;Teraz musisz zainstalować klienta synchronizacji na swoim Remarkable. Jeśli masz zainstalowane oprogramowanie &lt;strong&gt;toltec&lt;/strong&gt;, to sprawa jest prosta.&lt;/p&gt;
&lt;p&gt;Zaloguj się do Rm2 przez SSH i wydaj następujące polecenia:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
opkg&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;rmfakecloud-proxy&lt;span class="w"&gt;
&lt;/span&gt;rmfakecloudctl&lt;span class="w"&gt; &lt;/span&gt;set-upstream&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;URL&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;rmfakecloudctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Zamiast &lt;cite&gt;URL&lt;/cite&gt; podaj pełny adres swojego &lt;strong&gt;rmfakecloud&lt;/strong&gt;, w tym przykładzie będzie to:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
rmfakecloudctl&lt;span class="w"&gt; &lt;/span&gt;set-upstream&lt;span class="w"&gt; &lt;/span&gt;http://rmfakecloud.example.com:3033
&lt;/pre&gt;
&lt;p&gt;Następnie zainstaluj proxy:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/ddvk/rmfakecloud/master/scripts/device/automagic.sh&lt;span class="w"&gt; &lt;/span&gt;-O-&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I znowu podaj pełny URL do swojego &lt;strong&gt;rmfakecloud&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;OK, możesz się wylogować z Rm2.&lt;/p&gt;
&lt;p&gt;Na komputerze uruchom przeglądarkę i wejdź na stronę swojej instancji &lt;strong&gt;rmfakecloud&lt;/strong&gt; czyli w tym przykładzie: &lt;a class="reference external" href="http://rmfakecloud.example.com:3033"&gt;http://rmfakecloud.example.com:3033&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Załóż konto użytkownika i zapamiętaj hasło, w menu na górze strony wybierz opcję "Code" i wygeneruj kod.&lt;/p&gt;
&lt;img alt="Generowanie kodu do synchronizacji Rm2" src="/uploads/2024/10/rmfakecloud02.png" style="width: 700px;"/&gt;
&lt;p&gt;Wejdź na Remarkable w "Menu" -&amp;gt; "Settings" -&amp;gt; "General" i w "Pair ReMarkable Account". Wprowadź wygenerowany kod i połącz się ze swoją własną chmurą. Synchronizacja już powinna działać.&lt;/p&gt;
&lt;p&gt;Jeśli chcesz przesłać pliki na Rm2, otwórz stronę, zaloguj się i w zakładce "Documents" masz formularz dodawania dowolnych plików.&lt;/p&gt;
&lt;img alt="Dodawanie plików do Rm2" src="/uploads/2024/10/rmfakecloud01.png" style="width: 700px;"/&gt;
&lt;p&gt;c.d.n.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Tips"></category><category term="cloud"></category><category term="server"></category><category term="remarkable"></category><category term="docker"></category><category term="jailbreak"></category></entry><entry><title>Private cloud for Remarkable 2</title><link href="https://scyzoryk.fubar.pl/remarkable_rmfakecloud-en.html" rel="alternate"></link><published>2024-10-27T10:08:00+01:00</published><updated>2024-10-27T10:08:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2024-10-27:/remarkable_rmfakecloud-en.html</id><summary type="html">&lt;p&gt;The Remarkable notebook is a great device, but for full functionality, it (unfortunately) requires registration with the company's cloud service and a monthly subscription.&lt;/p&gt;
&lt;p&gt;What does the subscription provide?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;File synchronization&lt;/li&gt;
&lt;li&gt;Integrations with external file sources (using WebDAV or a dedicated directory in the local file system, instead of Google …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;The Remarkable notebook is a great device, but for full functionality, it (unfortunately) requires registration with the company's cloud service and a monthly subscription.&lt;/p&gt;
&lt;p&gt;What does the subscription provide?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;File synchronization&lt;/li&gt;
&lt;li&gt;Integrations with external file sources (using WebDAV or a dedicated directory in the local file system, instead of Google Drive and Dropbox)&lt;/li&gt;
&lt;li&gt;Sending documents via email&lt;/li&gt;
&lt;li&gt;Handwriting recognition!!!&lt;/li&gt;
&lt;li&gt;Screen sharing feature (though it doesn’t work remotely, and the app must be used over USB)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fortunately, thanks to independent developers, the corporate cloud can be replaced with one hosted on your own server.&lt;/p&gt;
&lt;p&gt;The process is simple when using Docker, and the full project documentation is available here: &lt;a class="reference external" href="https://ddvk.github.io/rmfakecloud/"&gt;rmfakecloud&lt;/a&gt;.&lt;/p&gt;
&lt;div class="section" id="cloud-installation"&gt;
&lt;h2&gt;Cloud Installation&lt;/h2&gt;
&lt;p&gt;On the server, create a docker-compose.yml file with the following content:&lt;/p&gt;
&lt;pre class="code dockerfile literal-block"&gt;
services:&lt;span class="w"&gt;
  &lt;/span&gt;rmfakecloud:&lt;span class="w"&gt;
    &lt;/span&gt;image:&lt;span class="w"&gt; &lt;/span&gt;ddvk/rmfakecloud&lt;span class="w"&gt;
    &lt;/span&gt;container_name:&lt;span class="w"&gt; &lt;/span&gt;rmfakecloud&lt;span class="w"&gt;
    &lt;/span&gt;restart:&lt;span class="w"&gt; &lt;/span&gt;unless-stopped&lt;span class="w"&gt;
    &lt;/span&gt;env_file:&lt;span class="w"&gt;
      &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;env&lt;span class="w"&gt;
    &lt;/span&gt;volumes:&lt;span class="w"&gt;
      &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;./data:/data&lt;span class="w"&gt;
    &lt;/span&gt;ports:&lt;span class="w"&gt;
      &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3033:80"&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Create an env file as well:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;JWT_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your&lt;span class="w"&gt; &lt;/span&gt;generated&lt;span class="w"&gt; &lt;/span&gt;token&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;STORAGE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://rmfakecloud.example.com:3033&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;LOGLEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debug&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_LOGFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/data/log&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RMAPI_HWR_APPLICATIONKEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;API&lt;span class="w"&gt; &lt;/span&gt;key&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;myscript.com&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RMAPI_HWR_HMAC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;HMAC&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;myscript.com&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_SMTP_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mail.example.com:587&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_SMTP_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user@example.com&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;RM_SMTP_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;password&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# RM_SMTP_FROM = custom “From:” header for emails (e.g., My remarkable remarkable@rmfakecloud.example.com).
#                If enabled, the user’s email address is placed in the “Reply-To:” field.
# RM_SMTP_HELO   Custom HELO if required by your mail provider
# RM_SMTP_NOTLS  Disable TLS
# RM_SMTP_STARTTLS   Use the STARTTLS command, usually on port 587.
# RM_SMTP_INSECURE_TLS If set, skip server certificate validation (not recommended).&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The token for JWT_SECRET_KEY can be generated with this command:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
openssl&lt;span class="w"&gt; &lt;/span&gt;rand&lt;span class="w"&gt; &lt;/span&gt;-base64&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;48&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;cite&gt;STORAGE_URL&lt;/cite&gt; variable contains the server name and port under which rmfakecloud will be accessible—essentially, your server's FQDN, e.g.: &lt;a class="reference external" href="http://rmfakecloud.example.com:3033"&gt;http://rmfakecloud.example.com:3033&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;cite&gt;RMAPI_HWR_APPLICATIONKEY&lt;/cite&gt; and &lt;cite&gt;RMAPI_HWR_HMAC&lt;/cite&gt; variables store, respectively, the API key and HMAC generated from French company MyScript [&lt;a class="reference external" href="https://developer.myscript.com/"&gt;https://developer.myscript.com/&lt;/a&gt;] for enabling handwriting recognition!!!&lt;/p&gt;
&lt;p&gt;You will need to create an account at myscript.com, but this gives you 2000 free conversions per month.&lt;/p&gt;
&lt;p&gt;After creating an account, you create an app, which will generate the aforementioned &lt;cite&gt;RMAPI_HWR_APPLICATIONKEY&lt;/cite&gt; and &lt;cite&gt;RMAPI_HWR_HMAC&lt;/cite&gt; variables. Below are two screenshots from myscript.com:&lt;/p&gt;
&lt;img alt="Tworzenie aplikacji w myscript.com" src="/uploads/2024/10/rm_myscript01.png" style="width: 700px;"/&gt;
&lt;hr class="docutils"/&gt;
&lt;img alt="Klucze aplikacji w myscript.com" src="/uploads/2024/10/rm_myscript02.png" style="width: 700px;"/&gt;
&lt;p&gt;The remaining variables pertain to the email server and are sufficiently described.&lt;/p&gt;
&lt;p&gt;Once everything is set up, start rmfakecloud:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;compose&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;-d
&lt;/pre&gt;
&lt;p&gt;Now you need to install the sync client on your Remarkable. If you have the toltec software installed, it’s simple.&lt;/p&gt;
&lt;p&gt;Log in to the Rm2 via SSH and enter the following commands:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
opkg&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;rmfakecloud-proxy&lt;span class="w"&gt;
&lt;/span&gt;rmfakecloudctl&lt;span class="w"&gt; &lt;/span&gt;set-upstream&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;URL&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;rmfakecloudctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Replace URL with the full address of your rmfakecloud, in this example:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
rmfakecloudctl&lt;span class="w"&gt; &lt;/span&gt;set-upstream&lt;span class="w"&gt; &lt;/span&gt;http://rmfakecloud.example.com:3033
&lt;/pre&gt;
&lt;p&gt;Next, install the proxy:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
sh&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/ddvk/rmfakecloud/master/scripts/device/automagic.sh&lt;span class="w"&gt; &lt;/span&gt;-O-&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Again, provide the full URL to your rmfakecloud.&lt;/p&gt;
&lt;p&gt;OK, you can log out of Rm2.&lt;/p&gt;
&lt;p&gt;On your computer, open a browser and go to the rmfakecloud instance page, for example: &lt;a class="reference external" href="http://rmfakecloud.example.com:3033"&gt;http://rmfakecloud.example.com:3033&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Create a user account, remember the password, and in the top menu, choose "Code" to generate a code.&lt;/p&gt;
&lt;img alt="Generowanie kodu do synchronizacji Rm2" src="/uploads/2024/10/rmfakecloud02.png" style="width: 700px;"/&gt;
&lt;p&gt;On the Remarkable, go to "Menu" -&amp;gt; "Settings" -&amp;gt; "General" and in "Pair ReMarkable Account," enter the generated code and connect to your own cloud. Synchronization should now work.&lt;/p&gt;
&lt;p&gt;To transfer files to Rm2, open the site, log in, and under the "Documents" tab, you'll find an upload form for any files.&lt;/p&gt;
&lt;img alt="Dodawanie plików do Rm2" src="/uploads/2024/10/rmfakecloud01.png" style="width: 700px;"/&gt;
&lt;p&gt;To be continued...&lt;/p&gt;
&lt;/div&gt;
</content><category term="Hack"></category><category term="remarkable"></category><category term="hack"></category></entry><entry><title>Hakowanie Remarkable 2</title><link href="https://scyzoryk.fubar.pl/hack_remarkable.html" rel="alternate"></link><published>2024-09-07T00:03:00+02:00</published><updated>2024-09-07T00:03:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2024-09-07:/hack_remarkable.html</id><summary type="html">&lt;p&gt;Toltec daje możliwość instalacji oprogamowania.&lt;/p&gt;
&lt;p&gt;⚠️ Uwaga: Toltec wspiera tylko wersje OS-a od: 2.6.1.71 do 3.3.2.1666.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Czyli muszę zrobić downgrade z obecnej wersji 3.14.1.9.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;⚠️ Uwaga, możliwe że notatki stworzone na wyższej wersji nie będą kompatybilne z wersją starszą.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Jayy001/codexctl"&gt;Kliknij tu aby pobrać …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Toltec daje możliwość instalacji oprogamowania.&lt;/p&gt;
&lt;p&gt;⚠️ Uwaga: Toltec wspiera tylko wersje OS-a od: 2.6.1.71 do 3.3.2.1666.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Czyli muszę zrobić downgrade z obecnej wersji 3.14.1.9.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;⚠️ Uwaga, możliwe że notatki stworzone na wyższej wersji nie będą kompatybilne z wersją starszą.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Jayy001/codexctl"&gt;Kliknij tu aby pobrać narzędzie do downgrade'u - codexctl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;W wersjach &amp;gt;=3.11 oprogramowania systemowego nie da się użyć automatycznego update'u. Należy pobrać firmware i rozpakować za pomocą dd.&lt;/p&gt;
&lt;p&gt;Umówmy się, że Remarkable ma IP: &lt;strong&gt;192.168.10.29&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Potrzebne ci hasło do SSH. Jest tu: "Menu" -&amp;gt; "Help" -&amp;gt; "Copyright &amp;amp; linceses". Hasło jest na dole strony - zachowaj je w bezpiecznym miejscu.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Pobierz plik aktualizacji za pomocą codexctl.&lt;/li&gt;
&lt;li&gt;Wyodrębnij obraz ext4 z pliku aktualizacji.&lt;/li&gt;
&lt;li&gt;Prześlij obraz na urządzenie.&lt;/li&gt;
&lt;li&gt;Ustal, która partycja jest partycją zapasową.&lt;/li&gt;
&lt;li&gt;Użyj dd, aby zapisać obraz na partycji zapasowej.&lt;/li&gt;
&lt;li&gt;Użyj codexctl restore, aby ustawić partycję zapasową jako aktywną.&lt;/li&gt;
&lt;li&gt;Zrestartuj urządzenie.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="pobierz-plik-aktualizacji-za-pomoca-codexctl"&gt;
&lt;h2&gt;1. Pobierz plik aktualizacji za pomocą codexctl.&lt;/h2&gt;
&lt;p&gt;Binarka: pobierz najnowszą wersję z: &lt;a class="reference external" href="https://github.com/Jayy001/codexctl/releases/"&gt;https://github.com/Jayy001/codexctl/releases/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rozpakuj i skopiuj na Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
wget&lt;span class="w"&gt; &lt;/span&gt;https://github.com/Jayy001/codexctl/releases/download/1719419372/remarkable.zip&lt;span class="w"&gt;
&lt;/span&gt;unzip&lt;span class="w"&gt; &lt;/span&gt;remarkable.zip&lt;span class="w"&gt;
&lt;/span&gt;scp&lt;span class="w"&gt; &lt;/span&gt;codexctl.bin&lt;span class="w"&gt; &lt;/span&gt;root@192.168.10.29:.
&lt;/pre&gt;
&lt;p&gt;Zbuduj &lt;strong&gt;codexctl&lt;/strong&gt; na laptopie i pobierz obraz:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/Jayy001/codexctl.git&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;codexctl&lt;span class="w"&gt;
&lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./venv/bin/activate&lt;span class="w"&gt;
&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt;
&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;requirements.remote.txt&lt;span class="w"&gt;
&lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;codexctl.py&lt;span class="w"&gt; &lt;/span&gt;download&lt;span class="w"&gt; &lt;/span&gt;toltec
&lt;/pre&gt;
&lt;p&gt;Pobrany obraz ma nazwę: &lt;strong&gt;3.3.2.1666_reMarkable2-ihUirIf133-.signed&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="wyodrebnij-obraz-ext4-z-pliku-aktualizacji"&gt;
&lt;h2&gt;2. Wyodrębnij obraz ext4 z pliku aktualizacji.&lt;/h2&gt;
&lt;p&gt;Rozpakuj obraz:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
python&lt;span class="w"&gt; &lt;/span&gt;codexctl.py&lt;span class="w"&gt; &lt;/span&gt;extract&lt;span class="w"&gt; &lt;/span&gt;--out&lt;span class="w"&gt; &lt;/span&gt;./3.3.2.1666_reMarkable2-ihUirIf133-.extracted&lt;span class="w"&gt; &lt;/span&gt;../3.3.2.1666_reMarkable2-ihUirIf133-.signed
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
$&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.3.2.1666_reMarkable2-ihUirIf133-.extracted&lt;span class="w"&gt;
&lt;/span&gt;extracted_fw:&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;rev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;ext4&lt;span class="w"&gt; &lt;/span&gt;filesystem&lt;span class="w"&gt; &lt;/span&gt;data,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fb041d03-92fd-48ab-993f-6ee5b0f954a7&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;extents&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;64bit&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;large&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;huge&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="przeslij-obraz-na-urzadzenie"&gt;
&lt;h2&gt;3. Prześlij obraz na urządzenie.&lt;/h2&gt;
&lt;p&gt;Skopiuj wyodrębniony obraz na Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
scp&lt;span class="w"&gt; &lt;/span&gt;./3.3.2.1666_reMarkable2-ihUirIf133.extracted&lt;span class="w"&gt; &lt;/span&gt;root@192.168.10.29:.
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="ustal-ktora-partycja-jest-partycja-zapasowa"&gt;
&lt;h2&gt;4. Ustal, która partycja jest partycją zapasową.&lt;/h2&gt;
&lt;p&gt;Na Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
root@reMarkable:~#&lt;span class="w"&gt; &lt;/span&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt;
&lt;/span&gt;Disk&lt;span class="w"&gt; &lt;/span&gt;/dev/mmcblk2:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7456&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;MB,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7818182656&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15269888&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sectors&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="m"&gt;238592&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cylinders,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;heads,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sectors/track&lt;span class="w"&gt;
&lt;/span&gt;Units:&lt;span class="w"&gt; &lt;/span&gt;sectors&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes&lt;span class="w"&gt;

&lt;/span&gt;Device&lt;span class="w"&gt;       &lt;/span&gt;Boot&lt;span class="w"&gt; &lt;/span&gt;StartCHS&lt;span class="w"&gt;    &lt;/span&gt;EndCHS&lt;span class="w"&gt;        &lt;/span&gt;StartLBA&lt;span class="w"&gt;     &lt;/span&gt;EndLBA&lt;span class="w"&gt;    &lt;/span&gt;Sectors&lt;span class="w"&gt;  &lt;/span&gt;Size&lt;span class="w"&gt; &lt;/span&gt;Id&lt;span class="w"&gt; &lt;/span&gt;Type&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p1&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;,0,1&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;671&lt;/span&gt;,3,16&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="m"&gt;2048&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;43007&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;40960&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.0M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p2&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;672&lt;/span&gt;,0,1&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;95&lt;/span&gt;,3,16&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="m"&gt;43008&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;595967&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;552960&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;270M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p3&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;96&lt;/span&gt;,0,1&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;543&lt;/span&gt;,3,16&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;595968&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1148927&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;552960&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;270M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p4&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;544&lt;/span&gt;,0,1&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1023&lt;/span&gt;,3,16&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1148928&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;15269887&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;14120960&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;6895M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;

&lt;/span&gt;root@reMarkable:~#&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p3&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ext4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;rw,relatime&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p1&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/var/lib/uboot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vfat&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,fmask&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0022&lt;/span&gt;,dmask&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0022&lt;/span&gt;,codepage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;437&lt;/span&gt;,iocharset&lt;span class="o"&gt;=&lt;/span&gt;iso8859-1,shortname&lt;span class="o"&gt;=&lt;/span&gt;mixed,errors&lt;span class="o"&gt;=&lt;/span&gt;remount-ro&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p4&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/home&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ext4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;rw,relatime&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Jak widać powyżej, jedynie &lt;strong&gt;/dev/mmcblk2p2&lt;/strong&gt; nie jest zamontowane, więc to jest partycja zapasowa.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="uzyj-dd-aby-zapisac-obraz-na-partycji-zapasowej"&gt;
&lt;h2&gt;5. Użyj dd, aby zapisać obraz na partycji zapasowej.&lt;/h2&gt;
&lt;pre class="code bash literal-block"&gt;
dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/root/3.3.2.1666_reMarkable2-ihUirIf133.extracted&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mmcblk2p2
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="uzyj-codexctl-restore-aby-ustawic-partycje-zapasowa-jako-aktywna"&gt;
&lt;h2&gt;6. Użyj codexctl restore, aby ustawić partycję zapasową jako aktywną.&lt;/h2&gt;
&lt;p&gt;Na Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
/home/root/codexctl.bin&lt;span class="w"&gt; &lt;/span&gt;restore
&lt;/pre&gt;
&lt;p&gt;Potwierdź dwa razy i wyłącz Rm2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="zrestartuj-urzadzenie"&gt;
&lt;h2&gt;7. Zrestartuj urządzenie.&lt;/h2&gt;
&lt;p&gt;Po restarcie masz starszy firmware.&lt;/p&gt;
&lt;/div&gt;
</content><category term="hack"></category></entry><entry><title>Hack Remarkable 2</title><link href="https://scyzoryk.fubar.pl/hack_remarkable-en.html" rel="alternate"></link><published>2024-09-07T00:02:00+02:00</published><updated>2024-09-07T00:02:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2024-09-07:/hack_remarkable-en.html</id><summary type="html">&lt;p&gt;Do you need additional tools on you Remarkable?&lt;/p&gt;
&lt;div class="section" id="use-toltec"&gt;
&lt;h2&gt;Use &lt;strong&gt;toltec&lt;/strong&gt;.&lt;/h2&gt;
&lt;blockquote&gt;
Toltec is a community-maintained repository of free software for the reMarkable tablet.
It is the recommended way to install software on the device.&lt;/blockquote&gt;
&lt;p&gt;But:&lt;/p&gt;
&lt;blockquote&gt;
⚠️ Warning: Toltec only supports OS builds between 2.6.1.71 and 3.3.2.1666 …&lt;/blockquote&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Do you need additional tools on you Remarkable?&lt;/p&gt;
&lt;div class="section" id="use-toltec"&gt;
&lt;h2&gt;Use &lt;strong&gt;toltec&lt;/strong&gt;.&lt;/h2&gt;
&lt;blockquote&gt;
Toltec is a community-maintained repository of free software for the reMarkable tablet.
It is the recommended way to install software on the device.&lt;/blockquote&gt;
&lt;p&gt;But:&lt;/p&gt;
&lt;blockquote&gt;
⚠️ Warning: Toltec only supports OS builds between 2.6.1.71 and 3.3.2.1666.&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;So, you need to downgrade from the current version (mine was 3.14.1.9) that's why I wrote this manual. Be careful: notes created on a higher version may not be compatible with an older version.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In versions &amp;gt;=3.11 of the system software, automatic updates are no longer possible. Firmware must be downloaded and extracted using dd.&lt;/p&gt;
&lt;p&gt;Say, your Remarkable has IP: &lt;strong&gt;192.168.10.29&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You need SSH password for RM2. Go to "Menu" -&amp;gt; "Help" -&amp;gt; "Copyright &amp;amp; linceses". At the bottom you'll find password - store it in the safe place.&lt;/p&gt;
&lt;p&gt;Here are the steps to downgrade firmware:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Download the upgrade file with codexctl.&lt;/li&gt;
&lt;li&gt;Extract the raw ext4 image from the upgrade file.&lt;/li&gt;
&lt;li&gt;Transfer the image to the device.&lt;/li&gt;
&lt;li&gt;Determine which partition is the fallback partition.&lt;/li&gt;
&lt;li&gt;Use dd to write the image to the fallback partition.&lt;/li&gt;
&lt;li&gt;Use codexctl restore to make the fallback partition active.&lt;/li&gt;
&lt;li&gt;Reboot the device.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="download-the-upgrade-file-with-codexctl"&gt;
&lt;h3&gt;1. Download the upgrade file with codexctl&lt;/h3&gt;
&lt;p&gt;You will need 2 versions of &lt;strong&gt;codexctl&lt;/strong&gt; binary - one for Rm2 and another for your PC.&lt;/p&gt;
&lt;div class="section" id="binary-for-rm2"&gt;
&lt;h4&gt;Binary for Rm2:&lt;/h4&gt;
&lt;p&gt;Download the latest version from: &lt;a class="reference external" href="https://github.com/Jayy001/codexctl/releases/"&gt;https://github.com/Jayy001/codexctl/releases/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Extract it and copy it to the Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
wget&lt;span class="w"&gt; &lt;/span&gt;https://github.com/Jayy001/codexctl/releases/download/1719419372/remarkable.zip&lt;span class="w"&gt;
&lt;/span&gt;unzip&lt;span class="w"&gt; &lt;/span&gt;remarkable.zip&lt;span class="w"&gt;
&lt;/span&gt;scp&lt;span class="w"&gt; &lt;/span&gt;codexctl.bin&lt;span class="w"&gt; &lt;/span&gt;root@192.168.10.29:.
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="binary-for-pc"&gt;
&lt;h4&gt;Binary for PC:&lt;/h4&gt;
&lt;p&gt;Build &lt;strong&gt;codexctl&lt;/strong&gt; on your PC/laptop and download the image with firmware:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/Jayy001/codexctl.git&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;codexctl&lt;span class="w"&gt;
&lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./venv/bin/activate&lt;span class="w"&gt;
&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;wheel&lt;span class="w"&gt;
&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;requirements.remote.txt&lt;span class="w"&gt;
&lt;/span&gt;python&lt;span class="w"&gt; &lt;/span&gt;codexctl.py&lt;span class="w"&gt; &lt;/span&gt;download&lt;span class="w"&gt; &lt;/span&gt;toltec
&lt;/pre&gt;
&lt;p&gt;Downloaded image has a name: &lt;strong&gt;3.3.2.1666_reMarkable2-ihUirIf133-.signed&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="extract-the-raw-ext4-image-from-the-firmware-file"&gt;
&lt;h3&gt;2. Extract the raw ext4 image from the firmware file&lt;/h3&gt;
&lt;p&gt;Extract the image:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
python&lt;span class="w"&gt; &lt;/span&gt;codexctl.py&lt;span class="w"&gt; &lt;/span&gt;extract&lt;span class="w"&gt; &lt;/span&gt;--out&lt;span class="w"&gt; &lt;/span&gt;./3.3.2.1666_reMarkable2-ihUirIf133-.extracted&lt;span class="w"&gt; &lt;/span&gt;../3.3.2.1666_reMarkable2-ihUirIf133-.signed
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
$&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.3.2.1666_reMarkable2-ihUirIf133-.extracted&lt;span class="w"&gt;
&lt;/span&gt;extracted_fw:&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt; &lt;/span&gt;rev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.0&lt;span class="w"&gt; &lt;/span&gt;ext4&lt;span class="w"&gt; &lt;/span&gt;filesystem&lt;span class="w"&gt; &lt;/span&gt;data,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fb041d03-92fd-48ab-993f-6ee5b0f954a7&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;extents&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;64bit&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;large&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;huge&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="transfer-the-image-to-the-device"&gt;
&lt;h3&gt;3. Transfer the image to the device.&lt;/h3&gt;
&lt;p&gt;Copy extracted image to the Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
scp&lt;span class="w"&gt; &lt;/span&gt;./3.3.2.1666_reMarkable2-ihUirIf133.extracted&lt;span class="w"&gt; &lt;/span&gt;root@192.168.10.29:.
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="determine-which-partition-is-the-fallback-partition"&gt;
&lt;h3&gt;4. Determine which partition is the fallback partition&lt;/h3&gt;
&lt;p&gt;On Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
root@reMarkable:~#&lt;span class="w"&gt; &lt;/span&gt;fdisk&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt;
&lt;/span&gt;Disk&lt;span class="w"&gt; &lt;/span&gt;/dev/mmcblk2:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7456&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;MB,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7818182656&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15269888&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sectors&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="m"&gt;238592&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cylinders,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;heads,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sectors/track&lt;span class="w"&gt;
&lt;/span&gt;Units:&lt;span class="w"&gt; &lt;/span&gt;sectors&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes&lt;span class="w"&gt;

&lt;/span&gt;Device&lt;span class="w"&gt;       &lt;/span&gt;Boot&lt;span class="w"&gt; &lt;/span&gt;StartCHS&lt;span class="w"&gt;    &lt;/span&gt;EndCHS&lt;span class="w"&gt;        &lt;/span&gt;StartLBA&lt;span class="w"&gt;     &lt;/span&gt;EndLBA&lt;span class="w"&gt;    &lt;/span&gt;Sectors&lt;span class="w"&gt;  &lt;/span&gt;Size&lt;span class="w"&gt; &lt;/span&gt;Id&lt;span class="w"&gt; &lt;/span&gt;Type&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p1&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;32&lt;/span&gt;,0,1&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;671&lt;/span&gt;,3,16&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="m"&gt;2048&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;43007&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;40960&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.0M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p2&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;672&lt;/span&gt;,0,1&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;95&lt;/span&gt;,3,16&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="m"&gt;43008&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;595967&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;552960&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;270M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p3&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;96&lt;/span&gt;,0,1&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;543&lt;/span&gt;,3,16&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;595968&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1148927&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;552960&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;270M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p4&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;544&lt;/span&gt;,0,1&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1023&lt;/span&gt;,3,16&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1148928&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;15269887&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;14120960&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;6895M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux&lt;span class="w"&gt;

&lt;/span&gt;root@reMarkable:~#&lt;span class="w"&gt; &lt;/span&gt;mount&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p3&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ext4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;rw,relatime&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p1&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/var/lib/uboot&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vfat&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;rw,relatime,fmask&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0022&lt;/span&gt;,dmask&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0022&lt;/span&gt;,codepage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;437&lt;/span&gt;,iocharset&lt;span class="o"&gt;=&lt;/span&gt;iso8859-1,shortname&lt;span class="o"&gt;=&lt;/span&gt;mixed,errors&lt;span class="o"&gt;=&lt;/span&gt;remount-ro&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;/dev/mmcblk2p4&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/home&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ext4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;rw,relatime&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;As seen above, only &lt;strong&gt;/dev/mmcblk2p2&lt;/strong&gt; is &lt;em&gt;NOT MOUNTED&lt;/em&gt;, so that is the fallback partition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="use-dd-to-write-the-image-on-the-fallback-partition"&gt;
&lt;h3&gt;5. Use dd to write the image on the fallback partition&lt;/h3&gt;
&lt;pre class="code bash literal-block"&gt;
dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/root/3.3.2.1666_reMarkable2-ihUirIf133.extracted&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mmcblk2p2
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="use-codexctl-restore-to-make-the-fallback-partition-active"&gt;
&lt;h3&gt;6. Use codexctl restore to make the fallback partition active&lt;/h3&gt;
&lt;p&gt;On Rm2:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
/home/root/codexctl.bin&lt;span class="w"&gt; &lt;/span&gt;restore
&lt;/pre&gt;
&lt;p&gt;Confirm twice and shut down Rm2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="reboot-the-device"&gt;
&lt;h3&gt;7. Reboot the device.&lt;/h3&gt;
&lt;p&gt;After the restart, you will have older firmware.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Hack"></category><category term="hack"></category><category term="jailbreak"></category><category term="remarkable"></category></entry><entry><title>HiDPI</title><link href="https://scyzoryk.fubar.pl/hidpi.html" rel="alternate"></link><published>2023-10-18T09:00:00+02:00</published><updated>2023-10-18T09:00:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-10-18:/hidpi.html</id><summary type="html">&lt;p&gt;Poniższe wpisy dotyczą maszynki: ThinkPad P14s Gen4 z dwoma monitorami Dell 24".&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
Screen 0: minimum 320 x 200, current 6240 x 2560, maximum 16384 x 16384
eDP-1 connected 2240x1400+0+0 (normal left inverted right x axis y axis) 302mm x 189mm

DP-3-8 connected primary 2560x1440+2240+0 (normal left …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;Poniższe wpisy dotyczą maszynki: ThinkPad P14s Gen4 z dwoma monitorami Dell 24".&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
Screen 0: minimum 320 x 200, current 6240 x 2560, maximum 16384 x 16384
eDP-1 connected 2240x1400+0+0 (normal left inverted right x axis y axis) 302mm x 189mm

DP-3-8 connected primary 2560x1440+2240+0 (normal left inverted right x axis y axis) 527mm x 296mm

DP-3-1 connected 1440x2560+4800+0 right (normal left inverted right x axis y axis) 527mm x 296mm
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Jak widać na powyższym obrazku, monitor laptopa ma 2240x1400, a oba monitory 2560x1440 (DP-3-1 jest obrócony pionowo), na szczęście dosyć podobne wartości więc odpowiednie ustawienie DPI nie popsuje zabawy.&lt;/div&gt;
&lt;div class="line"&gt;X odpalam za pomocą .xinitrc gdzie mam wpis:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
xrandr --dpi 192
&lt;/pre&gt;
&lt;p&gt;Mozilla Firefox:&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;wchodzę w ustawienia zaawansowane wpisując: &lt;a class="reference external" href="about:config"&gt;about:config&lt;/a&gt; w polu URL-a i ustawiam następującą opcję na dopasowaną do ekranu wartość :&lt;/div&gt;
&lt;div class="line"&gt;&lt;strong&gt;layout.css.devPixelsPerPx&lt;/strong&gt;: 0.7&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Chromium:&lt;/p&gt;
&lt;p&gt;rozwiązałem robiąć skrypt, np. w ~/bin/chroumium.sh:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/usr/bin/env bash

/usr/bin/chromium-bin --force-device-scale-factor=1.2 $1
&lt;/pre&gt;
&lt;p&gt;i linkując go do /usr/bin/chromium:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo ln -sf /home/pawelkaczor/bin/chromium.sh /usr/bin/chromium
&lt;/pre&gt;
</content><category term="Linux"></category><category term="monitoring"></category><category term="systemy"></category><category term="komunikacja"></category></entry><entry><title>Kindle Jailbreak</title><link href="https://scyzoryk.fubar.pl/kindle-jailbreak.html" rel="alternate"></link><published>2023-08-08T13:34:00+02:00</published><updated>2023-08-08T13:34:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-08-08:/kindle-jailbreak.html</id><summary type="html">&lt;p&gt;Ten wpis to po prostu opis Jailbreaka na starych Kindle. Zachowuję na wypadek, gdyby oficjalne strony przestały działać.&lt;/p&gt;
&lt;p&gt;Kindle 4.1.4&lt;/p&gt;
&lt;p&gt;Podłącz Kindle pod Linuksa i podmontuj jego dysk:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Zachowaj plik jailbreak:&lt;/p&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kindle-k4-jailbreak-1.8.N.zip"&gt;kindle-k4-jailbreak-1.8.N&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/kindle-k4-jailbreak-1.8.N.zip"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Rozpakuj plik i skopiuj na Kindle następujące …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ten wpis to po prostu opis Jailbreaka na starych Kindle. Zachowuję na wypadek, gdyby oficjalne strony przestały działać.&lt;/p&gt;
&lt;p&gt;Kindle 4.1.4&lt;/p&gt;
&lt;p&gt;Podłącz Kindle pod Linuksa i podmontuj jego dysk:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Zachowaj plik jailbreak:&lt;/p&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kindle-k4-jailbreak-1.8.N.zip"&gt;kindle-k4-jailbreak-1.8.N&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/kindle-k4-jailbreak-1.8.N.zip"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Rozpakuj plik i skopiuj na Kindle następujące pliki i folder:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cp -r data.tar.gz ENABLE_DIAGS diagnostic_logs /mnt/usb
sudo umount /mn/usb
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Zrestartuj Kindle, Menu -&amp;gt; Settings -&amp;gt; Menu -&amp;gt; Reboot.&lt;/div&gt;
&lt;div class="line"&gt;Po restarcie załaduje się menu, wybierz&lt;/div&gt;
&lt;div class="line"&gt;&lt;strong&gt;"D) Exit, Reboot or Disable Diags"&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line"&gt;wybierz:&lt;/div&gt;
&lt;div class="line"&gt;&lt;strong&gt;"R) Reboot System"&lt;/strong&gt; a potem:&lt;/div&gt;
&lt;div class="line"&gt;&lt;strong&gt;"Q) To continue"&lt;/strong&gt; (w opisie widzisz aby użyć 'FW Left', to oznacza klawisz w lewo na keypadzie).&lt;/div&gt;
&lt;div class="line"&gt;Poczekaj 20 sekund.&lt;/div&gt;
&lt;div class="line"&gt;Na ekranie powinieneś zobaczyć opis "Jailbreak" i po chwili Kindle znowu się zrestartuje.&lt;/div&gt;
&lt;div class="line"&gt;Po starcie powinieneś zobaczyć nową książkę zatytułowaną "You are Jailbroken".&lt;/div&gt;
&lt;div class="line"&gt;Jeśli ją widzisz to wszystko poszło dobrze.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="wp-block-group docutils container"&gt;
&lt;p class="wp-block-heading has-accent-color has-text-color rubric" id="procedura-updateu"&gt;Procedura Update'u&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;em&gt;Stosuj ją zawsze po wgraniu pliku update'u na root dysku Kindle'a.&lt;/em&gt;&lt;/div&gt;
&lt;div class="line"&gt;Odmontuj dysk Kindle'a. Odłącz od USB.&lt;/div&gt;
&lt;div class="line"&gt;Na Kindle wybierz: Menu -&amp;gt; Settings -&amp;gt; Menu -&amp;gt; Update Your Kindle.&lt;/div&gt;
&lt;div class="line"&gt;Kindle się zaktualizuje i zrestartuje.&lt;/div&gt;
&lt;/div&gt;
&lt;p class="wp-block-heading rubric" id="instalacja-kual"&gt;Instalacja KUAL&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Podłącz i podmontuj.&lt;/p&gt;
&lt;p&gt;Zapisz plik:&lt;/p&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kindle-mkk-20141129-r18833.tar.xz"&gt;kindle-mkk-20141129-r18833.tar&lt;/a&gt;` &amp;lt;/uploads/2023/08/kindle-mkk-20141129-r18833.tar.xz&amp;gt;`__&lt;/div&gt;
&lt;p&gt;Rozpakuj i skopiuj na Kindle odpowiedni plik:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo cp Update_mkk-20141129-k4-ALL_install.bin /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Wykonaj "Procedurę Update'u".&lt;/p&gt;
&lt;p&gt;Zapisz plik:&lt;/p&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/KUAL-v2.7.29-g7750a3a-20221017.tar.xz"&gt;KUAL-v2.7.29-g7750a3a-20221017.tar&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/KUAL-v2.7.29-g7750a3a-20221017.tar.xz"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Rozpakuj i skopiuj odpowiedni plik na Kindle'a:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo cp KUAL-KDK-1.0.azw2 /mnt/usb/documents
&lt;/pre&gt;
&lt;p&gt;Odmontuj. Na liście książek powinien pojawić się KUAL.&lt;/p&gt;
&lt;p&gt;Instalacja rozszerzeń (extensions) polega na podmontowaniu Kindle jak zwykle, a następnie rozpakowaniu następujących plików:&lt;/p&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kual-kual-plus-0.2.N-r13380.tar.xz"&gt;kual-kual-plus-0.2.N-r13380.tar&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/kual-kual-plus-0.2.N-r13380.tar.xz"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kual-mrinstaller-1.7.N-r18983.tar.xz"&gt;kual-mrinstaller-1.7.N-r18983.tar&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/kual-mrinstaller-1.7.N-r18983.tar.xz"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kual-batterystatus-1.1.N-r18977.tar.xz"&gt;kual-batterystatus-1.1.N-r18977.tar&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/kual-batterystatus-1.1.N-r18977.tar.xz"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kual-helper-0.5.N-r18980.tar.xz"&gt;kual-helper-0.5.N-r18980.tar&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/kual-helper-0.5.N-r18980.tar.xz"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;a następnie skopiowaniu folderów 'extensions'z każdego archiwum do '/mnt/usb/extensions'.&lt;/p&gt;
&lt;p&gt;Potem umount, odłączeniu od USB i w KUAL mamy rozszerzenia.&lt;/p&gt;
&lt;p&gt;Rozszerzenie "MRInstaller" pozwala na łatwe instalowaniepakietów. Wystarczy skopiować odpowiedni plik '*.bin' do katalogu '/mnt/usb/mrpackages', odmontować, odpiąć USB i w KUAL wybrać w menu:&lt;/p&gt;
&lt;p&gt;KUAL -&amp;gt; Helper+ -&amp;gt; "Install MR Packages".&lt;/p&gt;
&lt;div class="section" id="uruchomienie-sieci-po-usb"&gt;
&lt;h2&gt;Uruchomienie sieci po USB&lt;/h2&gt;
&lt;p&gt;Podłącz Kindle pod Linuksa i podmontuj jego dysk:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo mount /dev/sda1 /mnt/usb
&lt;/pre&gt;
&lt;p&gt;Zapisz plik:&lt;/p&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2023/08/kindle-usbnetwork-0.57.N-k4.zip"&gt;kindle-usbnetwork-0.57.N-k4&lt;/a&gt;&lt;a class="reference external" href="/uploads/2023/08/kindle-usbnetwork-0.57.N-k4.zip"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Rozpakuj. Skopiuj plik &lt;strong&gt;Update_usbnetwork_0.57.N_k4_install.bin&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo cp Update_usbnetwork_0.57.N_k4_install.bin /mnt/usb/
&lt;/pre&gt;
&lt;p&gt;Wykonaj "Procedurę Update'u".&lt;/p&gt;
&lt;p&gt;Po restarcie:&lt;/p&gt;
&lt;p&gt;uruchom KUAL, wybierz z menu: "USBNetwork" -&amp;gt; "Toggle USBNetwork",&lt;/p&gt;
&lt;p&gt;podłącz Kindle za pomocą USB do komputera,&lt;/p&gt;
&lt;p&gt;jeśli masz w kernelu wkompilowaną obsługę USBNet, powinno pojawić się nowe urządzenie o nazwie "usb0", sprawdź w logach:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo dmesg | grep -i usb
&lt;/pre&gt;
&lt;p&gt;przykładowy output:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[102242.978489] usb 1-1: new high-speed USB device number 17 using xhci_hcd
[102243.140236] usb 1-1: New USB device found, idVendor=0525, idProduct=a4a2, bcdDevice= 3.25
[102243.140242] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[102243.140244] usb 1-1: Product: RNDIS/Ethernet Gadget
[102243.140245] usb 1-1: Manufacturer: Linux 2.6.31-rt11-lab126 with fsl-usb2-udc
[102243.719328] cdc_subset: probe of 1-1:1.0 failed with error -22
[102243.722921] cdc_subset 1-1:1.1 usb0: register 'cdc_subset' at usb-0000:00:14.0-1, Linux Device, ea:9c:f4:38:3f:07
[102243.722953] usbcore: registered new interface driver cdc_subset
[102243.722972] cdc_ether: probe of 1-1:1.0 failed with error -16
[102243.722996] usbcore: registered new interface driver cdc_ether
[102243.732945] cdc_subset 1-1:1.1 enp0s20u1i1: renamed from usb0
&lt;/pre&gt;
&lt;p&gt;ustaw IP:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo ip addr add 192.168.15.201/24 dev enp0s20u1i1
&lt;/pre&gt;
&lt;p&gt;sprawdź czy połączenie działa:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
ping 192.168.15.244
&lt;/pre&gt;
&lt;p&gt;jeśli tak, możesz połączyć się przez SSH:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
ssh root@192.168.15.244
&lt;/pre&gt;
&lt;p&gt;hasło to "kindle".&lt;/p&gt;
&lt;p&gt;W KUAL można ustawić aby sieć i SSH startowały automatycznie po włączeniu Kindle oraz włączyć nasłuchiwanie na WiFi, ale to już inna para kaloszy.&lt;/p&gt;
&lt;p&gt;Więcej jest &lt;a class="reference external" href="https://wiki.mobileread.com/wiki/Kindle_Touch_Hacking#USB_Networking"&gt;na oficjalnej stronie&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Skróty w polu wyszukiwania&lt;/p&gt;
&lt;p&gt;Wywołaj klawiaturę i pole wyszukiwania naciskając na klawisz z klawiaturą. Poniżej lista skrótów:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
;dm - Dump messages to /documents
;dh - Dump cvm heap
;dt - Dump cvm stack
;shpm - set device to shipping mode
;urst - Reset user partition, deletes content of hidden System folder, Audible folder, Documents and tts folder.

Before using do a complete backup of your device
;debugOn - verbose logging
;debugPaint - log painting functions
;debugOff - non-verbose logging
;debugPref - pref level logging
;dP - alias of ;debugPref
;311 - change carrier settings
;411 - server information
;611 - wan information
;711 - wifi information
;fc-cache - updates fontconfig's cache, then restart the framework
;setTime - sets kindle time to unix clock
;st - alias of ;setTime (format: yyyy-mm-dd HH:MM – e.g.: ;st 2012-07-22 17:59)
~ds - Never show screen saver   (then you cannot lock the kindle till next reboot.
                                 Rebooting the Kindle will restore the screen saver lock
                                 and, hopefully, everything goes fine!)

;usbnetwork - toggle USB networking
;un - alias of ;usbNetwork
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="instalacja-linux-arch-na-kindle"&gt;
&lt;h2&gt;Instalacja Linux Arch na Kindle&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/Wint3rmute/arch-linux-on-kindle"&gt;https://github.com/Wint3rmute/arch-linux-on-kindle&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Hack"></category><category term="jailbreak"></category><category term="kindle"></category><category term="linux"></category></entry><entry><title>[Encrypted] Bydło</title><link href="https://scyzoryk.fubar.pl/bydlo.html" rel="alternate"></link><published>2023-07-18T12:34:00+02:00</published><updated>2023-07-18T12:34:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2023-07-18:/bydlo.html</id><summary type="html">Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;FlZ6f5m+E3xsN8qaENODPg==;ayCP+5zic5CZR8akjMDZz0B8TGofEPOLqIfGwPUQizfgcbi2FGPgtCVhAuwgNeg9db2A/OnQ6Pa2gmW3HNWQUczS4CXU8v7vzlQpnIuQsiMhUKuYND877gGZcB1N8uWfLZRLmvcbBjF4gWVlqgZUwLoIdgwr7TTJvIx6dlaKqS7NTOEMcvrBjBrHek1FEqAdDwF29sKLwEF1PoX9BYsMQygbN2k2FcPJHFm1IIoAkjGQkNb3rpTQDrQnENTY+Cy8nVRHDbP+6TdIYZEqvWccNTicwQfe9t/Rq7uHQkiO7/AcSP8kxErIpW7UN5+ZwnnpDfBfM2NWrk3aQPLSm41YBd93ghwtJUkOLe/b463zKLobTGcT7eORdxs+lCNapH+TxLjZ4ie2Vw2Sg7P/SaJfbqW2jcuUBpqO0oW44r/eoKvfne9Lg0nhe4C8yXqNxxMlhWTF0+V1y4lp5H818qiMT+q78SI3fvN55h6psW4L9tjxZ8r+cR3ERq0TyjCoHDjqCMK/S6bmLp6HgpF/6dyxfl1GLaI72IIJ15sU9W+kiQ28Nj3O51MKroAnvDnqHXYe9zAQn0HnAvYac8Btj4mcy8KC+bzrAt61LCdEhdfdCHZnR5He9z97xVQTKAeou43jGlOc3rGSPuFNcvZia2gwJTBLxfCu+TSSyI20HrBF9AgKcoRYcUfgbLJ5p0WQetZ7ibBPIgqI78XX6Cmas4t98oXJI0Y9bnIRVvKUn990tDUQcKZ+J/VBtYHSVhhHA8roZ9/AoLid9XNv/5EWVe5HECF7DCkoGQ3RKDidbWv5R+AbGiHM0Glk6tMtkfOCA0mEg0ov+Ey0lxRdTiZOGxlvVd1jdwiqMhzX1vbcOO0ke9mHWOhcxmgMJhRXFo3JXw1UAf2d97A/ZNmLK6b4mrCvsOd2QA+L8rLUWjjgNEJDaF0MbRCzKgsyxu9h1xvf+weI3ORpv4HIrIGPSoXjjqcTsA==;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="Shitz"></category></entry><entry><title>Mikrotik and radar</title><link href="https://scyzoryk.fubar.pl/mikrotik-and-radar.html" rel="alternate"></link><published>2023-06-24T11:06:00+02:00</published><updated>2023-06-24T11:06:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-06-24:/mikrotik-and-radar.html</id><summary type="html">&lt;p&gt;Network problems with my laptop begin to manifest few months ago. As I noticed then it was loosing connection to my 5GHz WiFi, automatically switching to another available network. I had no time to fix it. But month after month I noticed constant increase in those cases. So I investigated …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Network problems with my laptop begin to manifest few months ago. As I noticed then it was loosing connection to my 5GHz WiFi, automatically switching to another available network. I had no time to fix it. But month after month I noticed constant increase in those cases. So I investigated it last night discovering that Qualcomm WiFi interface discovers radar working nearby.&lt;/p&gt;
&lt;p&gt;But it's lie. There's no weather or plane radars in my sorroundings.&lt;/p&gt;
&lt;p&gt;I will not get into details as this already has been thouroughsly explained in this video:&lt;/p&gt;
&lt;video autoplay="" controls="" loop="" src="/uploads/2023/06/radar-dfs.mp4"&gt;&lt;p&gt;At last I've found a solution which works. Log in to the Mikrotik and provide following command, changing 'wlan2' to corresponding 5GHz interface in you router:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
/interface/wireless/set wlan2 skip-dfs-channels=all
&lt;/pre&gt;
&lt;p&gt;I'm not sure if this setting will survive reboot, so check it for yourself.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://youtu.be/ZbrbRUAfpac"&gt;Link do oryginału&lt;/a&gt;&lt;/p&gt;
&lt;/video&gt;</content><category term="Hardware"></category><category term="sieć"></category></entry><entry><title>Programowalne LEDy z Aliexpress</title><link href="https://scyzoryk.fubar.pl/programowalne_ledy_z_aliexpress.html" rel="alternate"></link><published>2023-06-09T00:03:00+02:00</published><updated>2023-06-09T00:03:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-06-09:/programowalne_ledy_z_aliexpress.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kolejny raz przekonałem się, że jeśli chcę czegoś nauczyć swoje dzieci, nie powinienem zbytnio oszczędzać.&lt;/p&gt;
&lt;p&gt;Mój młodszy syn chce zbudować sobie programowalne podświetlenie z LED-ów. Zamiast kupić sprawdzone, np. z Adafruit, przyjanuszyłem i kupiłem na Aliexpress.&lt;/p&gt;
&lt;p&gt;Dostawa zajęła ok. trzech tygodni więc prawie …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kolejny raz przekonałem się, że jeśli chcę czegoś nauczyć swoje dzieci, nie powinienem zbytnio oszczędzać.&lt;/p&gt;
&lt;p&gt;Mój młodszy syn chce zbudować sobie programowalne podświetlenie z LED-ów. Zamiast kupić sprawdzone, np. z Adafruit, przyjanuszyłem i kupiłem na Aliexpress.&lt;/p&gt;
&lt;p&gt;Dostawa zajęła ok. trzech tygodni więc prawie o nich zapomnieliśmy. Według opisu miały to być światełka typu WD-2813. O! My naiwni!&lt;/p&gt;
&lt;p&gt;Arduino Nano klon z CH340, potrzebny sterownik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parametry:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mikrokontroler: &lt;strong&gt;Atmega328 / 16MHz&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pamięć:&lt;strong&gt;Flash 32kB, EEPROM 1kB, SRAM 2kB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Konwerter:&lt;strong&gt;USB RS232  (CH340)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Złącze: &lt;strong&gt;Mini USB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Interfejs: &lt;strong&gt;SPI,UART,I2C&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wejścia: &lt;strong&gt;Analogowe 8 szt.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Porty: &lt;strong&gt;14 I/O  6x PWM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Zasilanie: &lt;strong&gt;5V&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wymiary: &lt;strong&gt;44mm x 18mm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moduł niezlutowany - do samodzielnego montażu.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Biblioteki: Adafruit i Fastled&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/dmadison/Adalight-FastLED"&gt;https://github.com/dmadison/Adalight-FastLED&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Biblioteka Fastled jest najlepsza.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.instructables.com/Cheap-Ambilight-Tutorial-for-PC-Using-Arduino/"&gt;https://www.instructables.com/Cheap-Ambilight-Tutorial-for-PC-Using-Arduino/&lt;/a&gt;&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
/*
 *  Project     Adalight FastLED
 *  @author     David Madison
 *  @link       github.com/dmadison/Adalight-FastLED
 *  @license    LGPL - Copyright (c) 2017 David Madison
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;http:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="na"&gt;www&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gnu&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;org&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;licenses&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;.
 *
 */

#include &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Arduino.h&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

// --- General Settings
const uint16_t
    Num_Leds   =  58;         // strip length
const uint8_t
    Brightness =  255;        // maximum brightness

// --- FastLED Setings
#define LED_TYPE     WS2813  // led strip type for FastLED
#define COLOR_ORDER  GRB      // color order for bitbang
#define PIN_DATA     3        // led data output pin
// #define PIN_CLOCK  7       // led data clock pin (uncomment if you're using a 4-wire LED type)

// --- Serial Settings
const unsigned long
    SerialSpeed    = 115200;  // serial port speed
const uint16_t
    SerialTimeout  = 60;      // time before LEDs are shut off if no data (in seconds), 0 to disable

// --- Optional Settings (uncomment to add)
#define SERIAL_FLUSH          // Serial buffer cleared on LED latch
// #define CLEAR_ON_START     // LEDs are cleared on reset

// --- Debug Settings (uncomment to add)
// #define DEBUG_LED 13       // toggles the Arduino's built-in LED on header match
// #define DEBUG_FPS 8        // enables a pulse on LED latch

// --------------------------------------------------------------------

#include &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;FastLED.h&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

CRGB leds[Num_Leds];
uint8_t * ledsRaw = (uint8_t *)leds;

// A 'magic word' (along with LED count &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; checksum) precedes each block
// of LED data; this assists the microcontroller in syncing up with the
// host-side software and properly issuing the latch (host I/O is
// likely buffered, making usleep() unreliable for latch). You may see
// an initial glitchy frame or two until the two come into alignment.
// The magic word can be whatever sequence you like, but each character
// should be unique, and frequent pixel values like 0 and 255 are
// avoided -- fewer false positives. The host software will need to
// generate a compatible header: immediately following the magic word
// are three bytes: a 16-bit count of the number of LEDs (high byte
// first) followed by a simple checksum value (high byte XOR low byte
// XOR 0x55). LED data follows, 3 bytes per LED, in order R, G, B,
// where 0 = off and 255 = max brightness.

const uint8_t magic[] = {
    'A','d','a'};
#define MAGICSIZE  sizeof(magic)

// Check values are header byte # - 1, as they are indexed from 0
#define HICHECK    (MAGICSIZE)
#define LOCHECK    (MAGICSIZE + 1)
#define CHECKSUM   (MAGICSIZE + 2)

enum processModes_t {Header, Data} mode = Header;

int16_t c;  // current byte, must support -1 if no data available
uint16_t outPos;  // current byte index in the LED array
uint32_t bytesRemaining;  // count of bytes yet received, set by checksum
unsigned long t, lastByteTime, lastAckTime;  // millisecond timestamps

void headerMode();
void dataMode();
void timeouts();

// Macros initialized
#ifdef SERIAL_FLUSH
    #undef SERIAL_FLUSH
    #define SERIAL_FLUSH while(Serial.available() &amp;gt; 0) { Serial.read(); }
#else
    #define SERIAL_FLUSH
#endif

#ifdef DEBUG_LED
    #define ON  1
    #define OFF 0

    #define D_LED(x) do {digitalWrite(DEBUG_LED, x);} while(0)
#else
    #define D_LED(x)
#endif

#ifdef DEBUG_FPS
    #define D_FPS do {digitalWrite(DEBUG_FPS, HIGH); digitalWrite(DEBUG_FPS, LOW);} while (0)
#else
    #define D_FPS
#endif

void setup(){
    #ifdef DEBUG_LED
        pinMode(DEBUG_LED, OUTPUT);
        digitalWrite(DEBUG_LED, LOW);
    #endif

    #ifdef DEBUG_FPS
        pinMode(DEBUG_FPS, OUTPUT);
    #endif

    #if defined(PIN_CLOCK) &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; defined(PIN_DATA)
        FastLED.addLeds&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;LED_TYPE&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;PIN_DATA&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;PIN_CLOCK&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;COLOR_ORDER&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;(leds, Num_Leds);
    #elif defined(PIN_DATA)
        FastLED.addLeds&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;LED_TYPE&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;PIN_DATA&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;COLOR_ORDER&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;(leds, Num_Leds);
    #else
        #error "No LED output pins defined. Check your settings at the top."
    #endif

    FastLED.setBrightness(Brightness);

    #ifdef CLEAR_ON_START
        FastLED.show();
    #endif

    Serial.begin(SerialSpeed);
    Serial.print("Ada\n"); // Send ACK string to host

    lastByteTime = lastAckTime = millis(); // Set initial counters
}

void loop(){
    t = millis(); // Save current time

    // If there is new serial data
    if((c = Serial.read()) &amp;gt;= 0){
        lastByteTime = lastAckTime = t; // Reset timeout counters

        switch(mode) {
            case Header:
                headerMode();
                break;
            case Data:
                dataMode();
                break;
        }
    }
    else {
        // No new data
        timeouts();
    }
}

void headerMode(){
    static uint8_t
        headPos,
        hi, lo, chk;

    if(headPos &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;MAGICSIZE&lt;/span&gt;&lt;span class="err"&gt;){&lt;/span&gt;
        &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;Check&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;magic&lt;/span&gt; &lt;span class="na"&gt;word&lt;/span&gt; &lt;span class="na"&gt;matches&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;c &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="na"&gt;magic&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;headPos&lt;/span&gt;&lt;span class="err"&gt;])&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="na"&gt;headPos&lt;/span&gt;&lt;span class="err"&gt;++;}&lt;/span&gt;
        &lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="na"&gt;headPos &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;else&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;Magic&lt;/span&gt; &lt;span class="na"&gt;word&lt;/span&gt; &lt;span class="na"&gt;matches&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt; &lt;span class="na"&gt;Now&lt;/span&gt; &lt;span class="na"&gt;verify&lt;/span&gt; &lt;span class="na"&gt;checksum&lt;/span&gt;
        &lt;span class="na"&gt;switch&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;headPos&lt;/span&gt;&lt;span class="err"&gt;){&lt;/span&gt;
            &lt;span class="na"&gt;case&lt;/span&gt; &lt;span class="na"&gt;HICHECK:&lt;/span&gt;
                &lt;span class="na"&gt;hi &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;c;&lt;/span&gt;
                &lt;span class="na"&gt;headPos&lt;/span&gt;&lt;span class="err"&gt;++;&lt;/span&gt;
                &lt;span class="na"&gt;break&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
            &lt;span class="na"&gt;case&lt;/span&gt; &lt;span class="na"&gt;LOCHECK:&lt;/span&gt;
                &lt;span class="na"&gt;lo &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;c;&lt;/span&gt;
                &lt;span class="na"&gt;headPos&lt;/span&gt;&lt;span class="err"&gt;++;&lt;/span&gt;
                &lt;span class="na"&gt;break&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
            &lt;span class="na"&gt;case&lt;/span&gt; &lt;span class="na"&gt;CHECKSUM:&lt;/span&gt;
                &lt;span class="na"&gt;chk &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;c;&lt;/span&gt;
                &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;chk &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;hi&lt;/span&gt; &lt;span class="err"&gt;^&lt;/span&gt; &lt;span class="na"&gt;lo&lt;/span&gt; &lt;span class="err"&gt;^&lt;/span&gt; &lt;span class="na"&gt;0x55&lt;/span&gt;&lt;span class="err"&gt;))&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
                    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;Checksum&lt;/span&gt; &lt;span class="na"&gt;looks&lt;/span&gt; &lt;span class="na"&gt;valid&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="na"&gt;Get&lt;/span&gt; &lt;span class="na"&gt;16-bit&lt;/span&gt; &lt;span class="na"&gt;LED&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;add&lt;/span&gt; &lt;span class="na"&gt;1&lt;/span&gt;
                    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;(#&lt;/span&gt; &lt;span class="na"&gt;LEDs&lt;/span&gt; &lt;span class="na"&gt;is&lt;/span&gt; &lt;span class="na"&gt;always&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 0) and multiply by 3 for R,G,B.
                    D_LED(ON);
                    bytesRemaining = 3L * (256L * (long)hi + (long)lo + 1L);
                    outPos = 0;
                    memset(leds, 0, Num_Leds * sizeof(struct CRGB));
                    mode = Data; // Proceed to latch wait mode
                }
                headPos = 0; // Reset header position regardless of checksum result
                break;
        }
    }
}

void dataMode(){
    // If LED data is not full
    if (outPos &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;sizeof&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;leds&lt;/span&gt;&lt;span class="err"&gt;)){&lt;/span&gt;
        &lt;span class="na"&gt;ledsRaw&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;outPos&lt;/span&gt;&lt;span class="err"&gt;++]&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;Issue&lt;/span&gt; &lt;span class="na"&gt;next&lt;/span&gt; &lt;span class="na"&gt;byte&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;bytesRemaining--&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;

    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;bytesRemaining &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="na"&gt;0&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;End&lt;/span&gt; &lt;span class="na"&gt;of&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt; &lt;span class="na"&gt;issue&lt;/span&gt; &lt;span class="na"&gt;latch:&lt;/span&gt;
        &lt;span class="na"&gt;mode &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Header;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;Begin&lt;/span&gt; &lt;span class="na"&gt;next&lt;/span&gt; &lt;span class="na"&gt;header&lt;/span&gt; &lt;span class="na"&gt;search&lt;/span&gt;
        &lt;span class="na"&gt;FastLED&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="err"&gt;();&lt;/span&gt;
        &lt;span class="na"&gt;D_FPS&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
        &lt;span class="na"&gt;D_LED&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;OFF&lt;/span&gt;&lt;span class="err"&gt;);&lt;/span&gt;
        &lt;span class="na"&gt;SERIAL_FLUSH&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="na"&gt;void&lt;/span&gt; &lt;span class="na"&gt;timeouts&lt;/span&gt;&lt;span class="err"&gt;(){&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;No&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt; &lt;span class="na"&gt;received&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt; &lt;span class="na"&gt;If&lt;/span&gt; &lt;span class="na"&gt;this&lt;/span&gt; &lt;span class="na"&gt;persists&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;send&lt;/span&gt; &lt;span class="na"&gt;an&lt;/span&gt; &lt;span class="na"&gt;ACK&lt;/span&gt; &lt;span class="na"&gt;packet&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="na"&gt;once&lt;/span&gt; &lt;span class="na"&gt;every&lt;/span&gt; &lt;span class="na"&gt;second&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt; &lt;span class="na"&gt;it&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;our&lt;/span&gt; &lt;span class="na"&gt;presence&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="err"&gt;((&lt;/span&gt;&lt;span class="na"&gt;t&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;lastAckTime&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;= 1000) {
        Serial.print("Ada\n"); // Send ACK string to host
        lastAckTime = t; // Reset counter

        // If no data received for an extended time, turn off all LEDs.
        if(SerialTimeout != 0 &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (t - lastByteTime) &amp;gt;= (uint32_t) SerialTimeout * 1000) {
            memset(leds, 0, Num_Leds * sizeof(struct CRGB)); //filling Led array by zeroes
            FastLED.show();
            mode = Header;
            lastByteTime = t; // Reset counter
        }
    }
}
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt; Note:&lt;/div&gt;
&lt;div class="line"&gt;The price is only Led Strip, Not Included Power Supply or Led Controller!&lt;/div&gt;
&lt;div class="line"&gt;WS2813 Must Use DC5V Power Supply AND Led Controller to Control!&lt;/div&gt;
&lt;div class="line"&gt;Every 0.5meter with solder joints, please note!&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Pay Attention:&lt;/div&gt;
&lt;div class="line"&gt;1, 30,60,144 means: 30 Leds/m, 60 Leds/m, 144 Leds/m&lt;/div&gt;
&lt;div class="line"&gt;2, IP30 Non-Waterproof / IP65 Waterproof in Silicon Coating / IP67 Waterproof in Silicon Tube&lt;/div&gt;
&lt;div class="line"&gt;3, IP30 IP65 with 3M adhensive tape on the back (IP67 without 3M adhensive)&lt;/div&gt;
&lt;div class="line"&gt;4, Each strip with one free male connector for, The length of the strip as you choose&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Main feature:&lt;/div&gt;
&lt;div class="line"&gt;One pixel damaged will not affect the other LEDs'working, Dual signal wires version, Signal can jump to transfer&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;FEATURES:&lt;/div&gt;
&lt;div class="line"&gt;LED Light Source: WS2813 LEDs ( Same Protocol as WS2811S But With Dual-Signal Wires,So Can Be Controlled by the Same WS2811/ws2812 Controllers)&lt;/div&gt;
&lt;div class="line"&gt;Input Voltage: DC 5V&lt;/div&gt;
&lt;div class="line"&gt;Power: 30 Leds/M --- 9 Watt/Meter / 60 Leds/M --- 18 Watt/Meter / 144 Leds/M --- 43.2 Watt/Meter&lt;/div&gt;
&lt;div class="line"&gt;LED Resource: WS2813 led (5050 SMD RGB LED with built-in improved version of ws2811 ic)&lt;/div&gt;
&lt;div class="line"&gt;LED: Each LED is separately controlled&lt;/div&gt;
&lt;div class="line"&gt;IC Type: Improved version ws2813 IC(built inside the 5050 smd rgb led)&lt;/div&gt;
&lt;div class="line"&gt;Of IC: (1 IC drives 1 led chip)&lt;/div&gt;
&lt;div class="line"&gt;Pixels: 30Leds/60Leds/144Leds/meter&lt;/div&gt;
&lt;div class="line"&gt;Pitch: 16.6mm(1000/64)&lt;/div&gt;
&lt;div class="line"&gt;Grey Scale: 256&lt;/div&gt;
&lt;div class="line"&gt;Colors: Full color RGB, dream color changing&lt;/div&gt;
&lt;div class="line"&gt;Bits/Color: 8-Bits/Color&lt;/div&gt;
&lt;div class="line"&gt;FPC Color: BLACK / White&lt;/div&gt;
&lt;div class="line"&gt;FPC Width: 30 Leds/M --- 10 MM / 60 Leds/M --- 10 MM / 144 Leds/M --- 12 MM&lt;/div&gt;
&lt;div class="line"&gt;Protection Rate: IP30 Non-Waterproof / IP65 Waterproof in Silicon Coating / IP67 Waterproof in Silicon Tube&lt;/div&gt;
&lt;div class="line"&gt;Cuttable: Every LED is cuttable&lt;/div&gt;
&lt;div class="line"&gt;Package: In anti-static bag, IP30 IP65 with 3M adhensive tape on the back (IP67 without 3M adhensive), each strip with one free male connector for connector&lt;/div&gt;
&lt;div class="line"&gt;Working Temperature: -40 - 70 °C&lt;/div&gt;
&lt;div class="line"&gt;Storage Temperature: -50 - 80 °C&lt;/div&gt;
&lt;div class="line"&gt;Source Life: 50,000 hours&lt;/div&gt;
&lt;div class="line"&gt;Connector: 4PIN connector terminal pair (Red: 5V power, Green: Date line, Blue: standby date line, Black: GND)&lt;/div&gt;
&lt;div class="line"&gt;Recommand controllers: T-1000s,T-8000A;T-100K;T-200K;T-300K&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;MORE FEATURES:&lt;/div&gt;
&lt;div class="line"&gt;(1)One pixel damaged will not affect the other LEDs working.&lt;/div&gt;
&lt;div class="line"&gt;(2)The power protection,if +5V and GND reverse polarity,the LED will not be burned.&lt;/div&gt;
&lt;div class="line"&gt;(3) Dual signal wires version, signal can jump to transfer.&lt;/div&gt;
&lt;div class="line"&gt;(4)The original electronic devices integrated,it does not cause virtual welding in the installation process.&lt;/div&gt;
&lt;div class="line"&gt;1, all the electronic components are integrated in a 5050 lamp beads, it does not require any other peripheral auxiliary electronic components to form a complete external control pixels. While reducing the product at the time of installation inverted Weld, caused by poor.&lt;/div&gt;
&lt;div class="line"&gt;2, serial cascade interface, dual-line signal transmission, to achieve the functions of HTTP, which under a single pixel without causing damage to its lower pixel normal lighting, silk ho does not affect the overall results.&lt;/div&gt;
&lt;div class="line"&gt;3, intelligent reverse polarity protection, product installation access 5V power supply in case of reverse, will not cause damage to the lamp beads.&lt;/div&gt;
&lt;div class="line"&gt;4, built-in signal shaping circuit, any one pixel after receiving the signal through the waveform shaping and then output to ensure line waveform distortion will not accumulate.&lt;/div&gt;
&lt;div class="line"&gt;5, the transmission distance between any two points in less than 5 meters without any additional signal amplification circuit.&lt;/div&gt;
&lt;div class="line"&gt;6, when a refresh rate of 30 frames / sec, the number of cascades of not less than 1024 points.&lt;/div&gt;
&lt;div class="line"&gt;7, the data transmission speed of up to 800Kbps. Light color consistency, cost-effective.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;LED WS2813 Symphony light strip Function Description:&lt;/div&gt;
&lt;div class="line"&gt;Happy control a single lamp, water, windows, rear meteor, chasing, pattern change animation, video, text, and so on. Use of the lamp, in which a pixel bad, does not affect the normal operation of other lights so as not to affect the overall results. Any color can show, random combinations into any pattern, in particular made light of the screen to use. No separate address to write to the lamp can be achieved HTTP, installation easier. Meanwhile lamp beads which also integrates a capacitive resistance, so that electronic components do not need to be on board the auxiliary light bar, thus increasing the stability of the product.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;LED WS2813 strip use for:&lt;/div&gt;
&lt;div class="line"&gt;The product rich colors and bright light, high visibility, more visually appealing. Is widely used in the corridor wall, indoor decoration, product model decorative lighting, decorative lighting consoles, speakers decorative lighting, entertainment, wine cooler bar backlight, smallpox backlight, LED light boxes, LED luminous signs, aquarium supplies, car decoration etc., it is to replace the traditional neon signs, fluorescent lamps and a new&lt;/div&gt;
&lt;/div&gt;
</content><category term="Hack"></category></entry><entry><title>Obelżywe treści?</title><link href="https://scyzoryk.fubar.pl/obelzywe-tresci.html" rel="alternate"></link><published>2023-06-09T00:02:00+02:00</published><updated>2023-06-09T00:02:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2023-06-09:/obelzywe-tresci.html</id><summary type="html">&lt;p&gt;Pewien bank działający w Polsce, z tego co z historii wiem, to założony przez nację, która przodowała w okradaniu Nowego Świata, odmówił mojemu synowi wydania karty z wybranym własnym wydrukiem. Powód widać na skanie odpowiedzi. A pod skanem załączam grafiki wybrane przez syna. Nie ma sensu komentować. Acha, to było …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Pewien bank działający w Polsce, z tego co z historii wiem, to założony przez nację, która przodowała w okradaniu Nowego Świata, odmówił mojemu synowi wydania karty z wybranym własnym wydrukiem. Powód widać na skanie odpowiedzi. A pod skanem załączam grafiki wybrane przez syna. Nie ma sensu komentować. Acha, to było przed amokiem z Ukrainą.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2023/06/obelga.png"&gt;&lt;img alt="image1" src="/uploads/2023/06/obelga.png" style="width: 700px; height: 696px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2023/06/0d00620fead19df4891b4157a9ada986.jpg"&gt;&lt;img alt="image2" src="/uploads/2023/06/0d00620fead19df4891b4157a9ada986.jpg" style="width: 700px; height: 534px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2023/06/obrazek2.png"&gt;&lt;img alt="image3" src="/uploads/2023/06/obrazek2.png" style="width: 700px; height: 716px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content><category term="Shitz"></category></entry><entry><title>Coś dla Windowsa mój kolego...</title><link href="https://scyzoryk.fubar.pl/cos-dla-windowsa-moj-kolego.html" rel="alternate"></link><published>2023-06-08T23:47:00+02:00</published><updated>2023-06-08T23:47:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-06-08:/cos-dla-windowsa-moj-kolego.html</id><summary type="html">&lt;p&gt;...nie pamiętam co, ale chyba niefajnego. :)&lt;/p&gt;
&lt;p&gt;Update żeby się okno akceptacji nie pojawiało:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
reg.exe ADD HKCU\Software\Sysinternals /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD HKU.DEFAULT\Software\Sysinternals /v EulaAccepted /t REG_DWORD /d 1 /f
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
random.ps1
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
$asig = "0x01", "0x02", "0x03", "0x04", "0x05", "0x06", "0x07 …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;...nie pamiętam co, ale chyba niefajnego. :)&lt;/p&gt;
&lt;p&gt;Update żeby się okno akceptacji nie pojawiało:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
reg.exe ADD HKCU\Software\Sysinternals /v EulaAccepted /t REG_DWORD /d 1 /f
reg.exe ADD HKU.DEFAULT\Software\Sysinternals /v EulaAccepted /t REG_DWORD /d 1 /f
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
random.ps1
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
$asig = "0x01", "0x02", "0x03", "0x04", "0x05", "0x06", "0x07", "0x08"
$vrnd = Get-Random -Minimum 0 -Maximum 50
if($vrnd -gt 20 -and $vrnd -lt 35) {

Write-Output $msig

$msig = Get-Random -Maximum $asig.count
C:\Windows\System32\nmf64.exe crash $msig

} else {

Write-Output $vrnd

Start-Job { C:\Windows\System32\runwhile.ps1 }

}

runwhile.ps1
while ($true){}
while ($true){}
while ($true){}
while ($true){}
while ($true){}
while ($true){}
while ($true){}
while ($true){}
&lt;/pre&gt;
&lt;p&gt;Oba są w C:\Windows\System32&lt;/p&gt;
&lt;p&gt;Wywoluje co 15 minut ze Schedulera.&lt;/p&gt;
</content><category term="Hack"></category><category term="windows"></category><category term="bezpieczeństwo"></category><category term="administracja"></category></entry><entry><title>ChatGPT driving a car</title><link href="https://scyzoryk.fubar.pl/chatgpt_driving_a_car.html" rel="alternate"></link><published>2023-06-06T06:08:00+02:00</published><updated>2023-06-06T06:08:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-06-06:/chatgpt_driving_a_car.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;I have quite stupid idea to allow ChatGPT operate a car. Lego Mindstorms car.&lt;/div&gt;
&lt;div class="line"&gt;Both with chat we have built Chrome add-on to parse chat output for specific commands written in simple language called /gpt:.&lt;/div&gt;
&lt;div class="line"&gt;Every command starts with /gtp: and have instruction …&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;I have quite stupid idea to allow ChatGPT operate a car. Lego Mindstorms car.&lt;/div&gt;
&lt;div class="line"&gt;Both with chat we have built Chrome add-on to parse chat output for specific commands written in simple language called /gpt:.&lt;/div&gt;
&lt;div class="line"&gt;Every command starts with /gtp: and have instruction for Lego car, so movig car forward for 10 seconds needs following string:&lt;/div&gt;
&lt;div class="line"&gt;/gpt:fwd-10&lt;/div&gt;
&lt;div class="line"&gt;And /gpt:left-15 turns car left at 15 degrees (how I will do it, I still don't know but will try it later).&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So, as for now I have working add-on, here is screenshot, it's in Polish but you got the idea:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2023/06/addon-kwadrat.jpg"&gt;&lt;img alt="image1" class="wp-image-1780" src="/uploads/2023/06/addon-kwadrat.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In next step I will use Native Messaging to send command with Bluetooth to Lego Mindstorms module.&lt;/p&gt;
</content><category term="Hack"></category></entry><entry><title>Polskie tłumaczenie "Refleksji o zaufaniu do zaufania" Kena Thompsona</title><link href="https://scyzoryk.fubar.pl/polskie_tlumaczenie_refleksji.html" rel="alternate"></link><published>2023-05-25T23:46:00+02:00</published><updated>2023-05-25T23:46:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-05-25:/polskie_tlumaczenie_refleksji.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony, a obecnie LLM zrobi to lepiej ode mnie.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nie jestem specjalnie zagorzałym zwolennikiem tłumaczenia wszystkich tekstów na język polski. Zwłaszcza w informatyce. Pewne rzeczy lepiej brzmią w oryginalnych językach i w tłumaczeniu, siłą rzeczy, tracą na przejrzystości albo, co jeszcze gorsze, błyskotliwości. Czasem …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony, a obecnie LLM zrobi to lepiej ode mnie.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nie jestem specjalnie zagorzałym zwolennikiem tłumaczenia wszystkich tekstów na język polski. Zwłaszcza w informatyce. Pewne rzeczy lepiej brzmią w oryginalnych językach i w tłumaczeniu, siłą rzeczy, tracą na przejrzystości albo, co jeszcze gorsze, błyskotliwości. Czasem po prostu nie istnieje w polskim ekwiwalentny odpowiednik, więc tłumacz musi próbować opisać tło czyli kontekst. Gdy jest historyczny, to zagwarantować mogę, że spójność i wartkość przekazu niechybnie ucierpi.&lt;/p&gt;
&lt;p&gt;Spotkałem się z tym problemem wielokrotnie podczas tłumaczenia "Soul of the New Machine" Tracy Kiddera. Jak wytłumaczyć czytelnikowi dlaczego prototyp komputera nosi imię postaci z komiksu albo dlaczego mapa USA na okładce "The New Yorkera" z 1976 roku wygląda tak jak poniżej?&lt;/p&gt;
&lt;div class="float wp-block-image size-large is-resized docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/05/Saul_Steinberg-New_York.jpg"&gt;&lt;img alt="image1" class="wp-image-1603" src="/uploads/2022/05/Saul_Steinberg-New_York.jpg" style="width: 306px; height: 413px;"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Uważam jednak, że w przypadków niektórych tesktów polskie tłumaczenie powinno powstać, a jeśli ktoś podejmie się tego wysiłku, to zobowiązany jest dobrze je wytłumaczyć. Dlaczego tak myślę? Po pierwsze, choć wiem jak prozaicznie to zabrzmi, nie każdy zna język oryginału. Już słyszę te głosy: "a po co komu znajomość literatury z tak specjalistycznego obszaru jak informatyka?". I jeszcze, że nie zapuszczanie się w takie rejony bez znajomości angielskiego to czyste wariactwo.&lt;/p&gt;
&lt;p&gt;Nieprawda. Te same komunały można powiedzieć o każdej dziedzinie i nadal pozostaną fałszywe. Każdy człowiek, nawet taki z tzw. otwartym umysłem, ciekawy wszystkiego, ma narzuconą przez rzeczywistość przepustowość informacyjną. Jeśli poświęci czas na naukę języka angielskiego, straci go tym samym na naukę czegoś innego. Zadaniem tłumacza jest rekompensata "straconego" czasu. W zamian, tłumacz ma nadzieję, zyska coś podobnego od innej osoby. Jest to więc zaraz zaciąganie i spłacanie długu.&lt;/p&gt;
&lt;p&gt;Jest jeszcze jeden aspekt, dotyczący rozwoju społeczeństwa oraz narodu ale nie będę go tu rozwijał bo wydaje mi się, że każde wie o co mi chodzi.&lt;/p&gt;
&lt;p&gt;Podejmuję wysiłek przetłumaczenia tekstu Kena Thompsona bo uważam, że jest to praca ważna i, wbrew pozorom, wcale nie dotycząca informatyki ale tematu o wiele szerszego i głębokiego.&lt;/p&gt;
&lt;p&gt;Zaufania.&lt;/p&gt;
&lt;p&gt;Ale zacznijmy w końcu:&lt;/p&gt;
&lt;div class="section" id="refleksje-nad-zaufaniem-do-zaufania"&gt;
&lt;h2&gt;Refleksje nad zaufaniem do zaufania&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Do jakiego stopnia powinniśmy ufać, że program jest wolny od koni trojańskich? Być może ważniejsze jest zaufanie do ludzi piszących oprogramowanie.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KEN THOMPSON&lt;/strong&gt;, 1984&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;WSTĘP&lt;/div&gt;
&lt;div class="line"&gt;Dziękuję ACM za tę nagrodę.&lt;sup&gt;1&lt;/sup&gt; Nic nie mogę zrobić z przeświadczeniem, że za honor ten w takim samym stopniu dopowiedzialny jest przypadek, jak i walory techniczne. Wraz z popularyzacją UNIX-a, który przeszedł od centralnie zarządzanych mainframe'ów do autonomicznych komputerów mini, nastapiła powszechna zmiana w przemyśle. Wydaje mi się, że zamiast mnie powinien tu być Daniel Bobrow [1], gdyby nie było go stać na PDP-10 i musiał "zadowolić się" PDP-11. Co więcej, obecna pozycja UNIX-a to efekt pracy wielkiej liczby ludzi.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Jest takie stare porzekadło, "Tańcz z tą, która cię przyprowadziła", co oznacza że powinieniem mówić o UNIX-ie. Chociaż nie zajmowałem się głównym rozwojem UNIX-a od wielu lat, to wciąż zbieram niezasłużone pochwały za pracę innych. W związku z tym, nie zamierzam mówić o UNXI-ie ale chcę podziękować każdemu, kto pomagał.&lt;/p&gt;
&lt;p&gt;To przywodzi mi na myśl Dennisa Ritchiego. Nasza współpraca była czymś pięknym. Przypominam sobie tylko jeden przypadek braku koordynacji na całe 10 lat wspólnej pracy. Odkryłem wtedy, że obaj napisaliśmy taki sam 20-linijkowy program w asemblerze. Porównałem oba kody źródłowe i byłem zdumiony faktem, że zgadzają się co do pojedynczego znaku. Rezultat naszej wspólnej pracy był daleko lepszy, niż praca którą wykonał każdy z nas.&lt;/p&gt;
&lt;p&gt;Jestem programistą.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Wypociny"></category></entry><entry><title>Arch Linux na Macbooku Pro Late 2013 (11,3)</title><link href="https://scyzoryk.fubar.pl/arch-linux-na-macbooku-pro-late-2013-113.html" rel="alternate"></link><published>2023-05-25T23:45:00+02:00</published><updated>2023-05-25T23:45:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-05-25:/arch-linux-na-macbooku-pro-late-2013-113.html</id><summary type="html">&lt;p&gt;Instalacja wg poniższych poradników:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/title/MacBookPro11,x"&gt;https://wiki.archlinux.org/title/MacBookPro11,x&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oraz z pomocą oficjalnego przewodnika:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/title/Installation_guide"&gt;https://wiki.archlinux.org/title/Installation_guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Używałem również następującego obrazka ale ostrzegam, to jest dość stara instrukcja i nowicjusz, jak ja, może się przez nią zagubić.&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/06/arch_cheatsheet.jpeg"&gt;&lt;img alt="image1" class="wp-image-1614" src="/uploads/2022/06/arch_cheatsheet-700x345.jpeg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Przy pierwszej próbie popełniłem błąd tworząc partycję EFI …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Instalacja wg poniższych poradników:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/title/MacBookPro11,x"&gt;https://wiki.archlinux.org/title/MacBookPro11,x&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oraz z pomocą oficjalnego przewodnika:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/title/Installation_guide"&gt;https://wiki.archlinux.org/title/Installation_guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Używałem również następującego obrazka ale ostrzegam, to jest dość stara instrukcja i nowicjusz, jak ja, może się przez nią zagubić.&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/06/arch_cheatsheet.jpeg"&gt;&lt;img alt="image1" class="wp-image-1614" src="/uploads/2022/06/arch_cheatsheet-700x345.jpeg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Przy pierwszej próbie popełniłem błąd tworząc partycję EFI podczas gdy po instalacji macOS-a taka partycja już istniała. W efekcie nic nie działało, a mnie się grzebać nie chciało i zaczałem wszystko od nowa.&lt;/p&gt;
&lt;p&gt;Na razie bootowanie jest za pomocą refinda ale chyba z niego zrezygnuję tylko wczytam się w dokumentację i zrobię porządny konfig bezpośrednio w&lt;/p&gt;
&lt;div class="section" id="karta-graficzna-ma-byc-tylko-intel-a-nvidia-wylaczona-z-pradu"&gt;
&lt;h2&gt;Karta graficzna (ma być tylko Intel, a NVidia wyłączona z prądu)&lt;/h2&gt;
&lt;p&gt;Macbook Pro ma 2 karty graficzne: dyskretną, mocną NVidii i słabą, intelowską. macOS radzi sobie doskonale z przełączaniem pomiędzy nimi, zależnie od potrzeby. W Linuksie nie ma łatwo. A robię to po to aby oszczędzać energię (i baterię), na Intelu laptop żre mniej energii i dłużej działa. Proste.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Są trzy sposoby.&lt;/div&gt;
&lt;div class="line"&gt;Pierwszy polega na &lt;a class="reference external" href="https://lists.gnu.org/archive/html/grub-devel/2013-12/msg00442.html"&gt;patchu dodanym do źródeł GRUB-a&lt;/a&gt; i zianstalowaniu takiej przerobionej wersji. Potem należy dodać do opcji startowych kernela dodać wpis "apple_set_os".&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tutaj opis: &lt;a class="reference external" href="https://wiki.archlinux.org/title/MacBookPro11,x#Getting_the_integrated_intel_card_to_work_on_11,3"&gt;https://wiki.archlinux.org/title/MacBookPro11,x#Getting_the_integrated_intel_card_to_work_on_11,3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Można też pobrać spreparowany loader dla refinda i startować Archa z jego pomocą. Tutaj link: &lt;a class="reference external" href="https://github.com/0xbb/apple_set_os.efi"&gt;https://github.com/0xbb/apple_set_os.efi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sprawdzenie, która karty są w systemie:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
lspci -vnnn | perl -lne 'print if /^\d+\:.+(\[\S+\:\S+\])/' | grep VGA
&lt;/pre&gt;
&lt;p&gt;W przypadku Nvidii zwraca to:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107M [GeForce GT 750M Mac Edition] [10de:0fe9] (rev a1) (prog-if 00 [VGA controller])
&lt;/pre&gt;
&lt;p&gt;W przypadku Intela to:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
00:02.0 VGA compatible controller [0300]: Intel Corporation Crystal Well Integrated Graphics Controller [8086:0d26] (rev 08) (prog-if 00 [VGA controller])
&lt;/pre&gt;
&lt;p&gt;Na początek, po paru próbach, w końcu skopiowałem odpowiedni obraz efi (&lt;a class="reference external" href="https://github.com/0xbb/apple_set_os.efi"&gt;https://github.com/0xbb/apple_set_os.efi&lt;/a&gt;) i zainstalowałem Gruba.&lt;/p&gt;
&lt;p&gt;Instalacja GRUB: &lt;a class="reference external" href="https://wiki.archlinux.org/title/Mac#Using_the_native_Apple_boot_loader_with_GRUB"&gt;https://wiki.archlinux.org/title/Mac#Using_the_native_Apple_boot_loader_with_GRUB&lt;/a&gt;&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo su -
pacman -S grub
pacman -S efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=DUPA
&lt;/pre&gt;
&lt;p&gt;DUPA to nazwa katalogu, który pojawi się w /boot i jednocześnie ID wpisu. Potem jeszcze trzeba wyprodukować konfigurację Gruba ale najpierw dopisać do pliku: /etc/grub.d/40_custom następującą zawartość:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
search --no-floppy --set=root --label EFI
chainloader (${root})/EFI/custom/apple_set_os.efi
boot
&lt;/pre&gt;
&lt;p&gt;Teraz tworzę konfig:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
grub-mkconfig -o /boot/grub/grub.cfg
&lt;/pre&gt;
&lt;p&gt;Po zbootowaniu, używam narzędzia gpu-switch (&lt;a class="reference external" href="https://github.com/0xbb/gpu-switch"&gt;https://github.com/0xbb/gpu-switch&lt;/a&gt;) aby włączyć grafikę Intela:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
gpu-switch -i
&lt;/pre&gt;
&lt;p&gt;Robię reboot i sprawdzam, która karta jest aktywna:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cat /sys/kernel/debug/vgaswitcheroo/switch
&lt;/pre&gt;
&lt;p&gt;Output wygląda podobnie:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
0:DIS-Audio: :DynOff:0000:01:00.1
1:IGD:+:Pwr:0000:00:02.0
2:DIS: :Pwr:0000:01:00.0
&lt;/pre&gt;
&lt;p&gt;Onacza to, że aktywna jest grafika intelowska ale NVidia nadal jest zasilana, a to mi się nie podoba. Należy ją wyłączyć następującym poleceniem:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
echo OFF &amp;gt; /sys/kernel/debug/vgaswitcheroo/switch
&lt;/pre&gt;
&lt;p&gt;Po ponownym sprawdzeniu cat-em mam to o co chodziło:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
0:DIS-Audio: :DynOff:0000:01:00.1
1:IGD:+:Pwr:0000:00:02.0
2:DIS: :Off:0000:01:00.0
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Karta o indeksie 2 (czyli NVidia) jest wyłączona.&lt;/div&gt;
&lt;div class="line"&gt;Przydatny link: &lt;a class="reference external" href="https://wiki.archlinux.org/title/MacBookPro10,x#Graphics"&gt;https://wiki.archlinux.org/title/MacBookPro10,x#Graphics&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="wifi"&gt;
&lt;h2&gt;WiFi&lt;/h2&gt;
&lt;p&gt;Pierwszą rzeczą, która nie działała po instalce była karta WiFi.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
pacman -S networkmanager
&lt;/pre&gt;
&lt;div class="section" id="ciche-bootowanie"&gt;
&lt;h3&gt;Ciche bootowanie&lt;/h3&gt;
&lt;p&gt;Wyciszenie dzwieku przy bootowaniu, koniecznie jako root:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
chattr -i /sys/firmware/efi/efivars/SystemAudioVolume-7c436110-ab2a-4bbb-a880-fe41995c9f82

printf "\x07\x00\x00\x00\x00" &amp;gt; /sys/firmware/efi/efivars/SystemAudioVolume-7c436110-ab2a-4bbb-a880-fe41995c9f82
&lt;/pre&gt;
&lt;p&gt;&lt;a class="reference external" href="https://gist.github.com/0xbb/ae298e2798e1c06d0753"&gt;https://gist.github.com/0xbb/ae298e2798e1c06d0753&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="zapamietanie-hasla-nextcloud-i-inne-programy"&gt;
&lt;h3&gt;Zapamiętanie hasła (Nextcloud i inne programy)&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;W przypadku uruchamiania Nextcloud z automatu potrzebny jest jakis "zasobnik" na hasla, w moim przypadku keyring z Gnome:&lt;/div&gt;
&lt;div class="line"&gt;sudo pacman -S libgnome-keyring&lt;/div&gt;
&lt;div class="line"&gt;sudo pacman -S gnome-keyring&lt;/div&gt;
&lt;div class="line"&gt;Potem przed odpaleniem klienta Nextcloud nalezy wywolac:&lt;/div&gt;
&lt;div class="line"&gt;dbus-update-activation-environment --systemd DISPLAY&lt;/div&gt;
&lt;div class="line"&gt;U mnie jest to w pliku startowym ~/bin/xmonad-startup.sh, ktory jest wywolywany z .xinitrc&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="xorg"&gt;
&lt;h3&gt;Xorg&lt;/h3&gt;
&lt;div class="section" id="informacje-ogolne"&gt;
&lt;h4&gt;Informacje ogólne&lt;/h4&gt;
&lt;p&gt;Do wyłapywania kodów klawiatury znakomicie nadaje się program xev, używam go tak:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
xev | sed -n 's/^.*keycode *\([0-9]\+\).*$/keycode \1 = /p'
&lt;/pre&gt;
&lt;p&gt;W oknie które się pojawi wystarczy wciskać klawisze lub ich kombinacje, a w konsoli pojawiają się odpowiadające im kody.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="display-manager"&gt;
&lt;h4&gt;Display manager&lt;/h4&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Display managerem przestal byc SDDM, a zastapil go ly &lt;a class="reference external" href="https://github.com/fairyglade/ly"&gt;https://github.com/fairyglade/ly&lt;/a&gt;:&lt;/div&gt;
&lt;div class="line"&gt;yay -S ly&lt;/div&gt;
&lt;div class="line"&gt;Wazne! .xinitrc musi byc plikiem wykonywalnym&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="klawiatura"&gt;
&lt;h4&gt;Klawiatura&lt;/h4&gt;
&lt;p&gt;Układ klawiatury X'ów zapisałem w .Xmodmap, który wczytuję w .xinitrc, linia:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
xmodmap ~/.Xmodmap
&lt;/pre&gt;
&lt;p&gt;zawartość .Xmodmap to:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
# Rewers myszy
pointer = 1 2 3 5 4 7 6 8 9 10 11 12
# Klawisze ciemniej / jasniej
keycode 232 = XF86KbdBrightnessDown
keycode 233 = XF86KbdBrightnessUp
# Poswietlenie klawiatury F5 i F6 z Shiftem
keycode 237 = XF86KbdBrightnessDown
keycode 238 = XF86KbdBrightnessUp
# Cisza / Ciszej / Glosniej F10/F11/F12
keycode 121 = XF86AudioMute
keycode 122 = XF86AudioLowerVolume
keycode 123 = XF86AudioRaiseVolume
&lt;/pre&gt;
&lt;p&gt;następnie remapuję klawisze, np. żeby zamiast prawego Super mieć Alt do polskich liter, w .xinitrc:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
/home/paczor/bin/klawisz_pl.sh
&lt;/pre&gt;
&lt;p&gt;zawartość klawisz_pl.sh:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
setxkbmap -model apple -layout pl -option caps:none
#/usr/bin/xmodmap -e 'remove mod4 = Super_R'
/usr/bin/xmodmap -e 'keycode 134 ='
/usr/bin/xmodmap -e 'keycode  94 = grave asciitilde grave asciitilde'
/usr/bin/xmodmap -e 'keycode 134 = ISO_Level3_Shift'
/usr/bin/xmodmap -e 'clear mod4'
#/usr/bin/xmodmap -e 'keycode 135 ='
#/usr/bin/xmodmap -e 'keycode 135 = ISO_Level3_Shift'
&lt;/pre&gt;
&lt;p&gt;Mam więc zamapowany lewe Jabłko (lewy Cmd) jako klawisz Super, prawe Jabłko jako prawy Alt, klawisze funkcyjne działają normalnie, a ich funkcje specjalne osiągalne są gdy trzymam wciśnięty Fn.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="screensaver"&gt;
&lt;h4&gt;Screensaver&lt;/h4&gt;
&lt;p&gt;W pliku &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.config/systemd/user/xscreensaver.service&lt;/span&gt;&lt;/tt&gt; mam unit dla systemd do odpalania xscreensavera, jego zawartość:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Unit]
Description=XScreenSaver Daemon
[Service]
ExecStart=/usr/bin/xscreensaver --no-splash
[Install]
WantedBy=default.target
&lt;/pre&gt;
&lt;p&gt;Włączam go przez:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl --user enable xscreesaver.service
&lt;/pre&gt;
&lt;p&gt;W ~/.xmonad/xmonad.hs mam linię mapującą Super+F12 na włączenie blokady ekranu, wygląda to tak:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
, ((mod4Mask, 0xffc9), spawn "xscreensaver-command -lock")
&lt;/pre&gt;
&lt;p&gt;Jak dodawać własne serwisy do systemd, tutaj: &lt;a class="reference external" href="https://wiki.archlinux.org/title/Systemd/User"&gt;https://wiki.archlinux.org/title/Systemd/User&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="wiatraki"&gt;
&lt;h2&gt;Wiatraki&lt;/h2&gt;
&lt;p&gt;Laptop był/jest głośny, wiatraki kręcą się niemal cały czas na dużych obrotach chociaż load sytemu waha się wokół 10%, a temperatura CPU rzadko przekracza 70 st. Ej? To jest laptop, on tak może długo, nawet jeśli ma już ponad 8 lat (w 2022 r.). Powinien być cichy.&lt;/p&gt;
&lt;p&gt;Zainstalowałem macfand-git, włączyłem ale wiatraki nadal szalały i zdarzało się pełne wyłączenie i włączenie - taki chwilowy suspend do RAM. Wyłączyłem.&lt;/p&gt;
&lt;p&gt;Zainstalowałem mbfan-git&lt;/p&gt;
&lt;p&gt;yay -S mbfan-git&lt;/p&gt;
&lt;p&gt;I jest ciszej ale co kilka sekund wiatraki wchodzą na obroty, wnerwiające. Temperatura skoczyła do ponad 83 st.!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="hibernacja"&gt;
&lt;h2&gt;Hibernacja&lt;/h2&gt;
&lt;p&gt;Przed przejściem do stanu hibernacji dane z pamięci RAM powinny zostać gdzieś zapisane aby mogły być wczytane wraz z powrotem do stanu życia. U mnie jest to partycja swap.&lt;/p&gt;
&lt;p&gt;Kernel musi "wiedzieć" gdzie szukać tych danych więc należy wskazać mu ww partycję. W przypadku używania GRUB-a polega to na edycji pliku /etc/default/grup i dodaniu wskazówki w linii:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
GRUP_CMDLINE_LINUX_DEFAULT=""
&lt;/pre&gt;
&lt;p&gt;ale wcześniej muszę znać UUID moje partycji swap, czyli:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo blkid -o full /dev/nvme0n1p4
/dev/nvme0n1p4: UUID="2004ae52-7d11-41a0-876d-4f3fa35ca2c4" TYPE="swap" PARTUUID="7853967f-c3fa-4183-9f9c-8d3fd9cee41f"
&lt;/pre&gt;
&lt;p&gt;czyli linia ma wyglądać tak:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=2004ae52-7d11-41a0-876d-4f3fa35ca2c4"
&lt;/pre&gt;
&lt;p&gt;Następnie generuję konfig dla GRUB-a:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
grub-mkconfig -o /boot/grub/grub.cfg
&lt;/pre&gt;
&lt;p&gt;Pozostało jeszcze skonfigurować initramfs. W pliku &lt;tt class="docutils literal"&gt;/etc/mkinitcpio.conf&lt;/tt&gt; dopisujemy hook o nazwie resume, przykładowa linia powinna wyglądać podobnie:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
HOOKS=(base udev autodetect keyboard modconf block filesystems resume fsck)
&lt;/pre&gt;
&lt;p&gt;I generujemy nowy initramfs:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
mkinitcpio -P
&lt;/pre&gt;
&lt;p&gt;Wprowadzone zmiany oczywiście zadziałają dopiero po restarcie.&lt;/p&gt;
&lt;p&gt;Warto zajrzeć do plików znajdujących się w /sys/power oraz poczytać jak kernel zarządza energią:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.kernel.org/admin-guide/pm/sleep-states.html?highlight=image_size#basic-sysfs-interfaces-for-system-suspend-and-hibernation"&gt;https://docs.kernel.org/admin-guide/pm/sleep-states.html?highlight=image_size#basic-sysfs-interfaces-for-system-suspend-and-hibernation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Przy konfiguracji posługiwałem się tym linkiem: &lt;a class="reference external" href="https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate"&gt;https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Linux"></category></entry><entry><title>Łkając nad sytuacją, piszę</title><link href="https://scyzoryk.fubar.pl/lkajac-nad-sytuacja-pisze.html" rel="alternate"></link><published>2023-05-25T23:43:00+02:00</published><updated>2023-05-25T23:43:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2023-05-25:/lkajac-nad-sytuacja-pisze.html</id><summary type="html">&lt;p&gt;Czy zbyt wiele wymagam gdy sam chcę decydować jakiego systemu będę używał na laptopie lub telefonie? Na to wygląda. Podchodzę do swoich wyborów zbyt ideologicznie.&lt;/p&gt;
&lt;p&gt;Nie chcę być zmuszany, a coraz częściej łapię ICH na tym, że to co dostaję to jest nie mój wybór. Ukułem nawet nowy termin, wzorując …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Czy zbyt wiele wymagam gdy sam chcę decydować jakiego systemu będę używał na laptopie lub telefonie? Na to wygląda. Podchodzę do swoich wyborów zbyt ideologicznie.&lt;/p&gt;
&lt;p&gt;Nie chcę być zmuszany, a coraz częściej łapię ICH na tym, że to co dostaję to jest nie mój wybór. Ukułem nawet nowy termin, wzorując się na WYSIWYG, i jest to: What You Get Is What We Want You To Get. Ostatnie trzy słowa są zbędne więc wychodzi zgrabne nawiązanie do sieci Web: WYGWWW.&lt;/p&gt;
&lt;p&gt;Do &lt;strong&gt;SIECI&lt;/strong&gt;. Gdy sieć staje się matnią.&lt;/p&gt;
&lt;p&gt;Kiedyś używałem Apple, i systemu, i komputerów. Z systemu zrezygnowałem kiedy zorientowałem się, że coraz rzadziej to ja decyduję, co dzieje się na MOIM laptopie, a coraz częściej, w imię bezpieczeństwa, to ONI robią z nim co chcą. Czy chcielibyście kupić kosiarkę do trawy, która kosi wasz ogród również tam, gdzie życzy sobie jej producent? Z pewnością nie.&lt;/p&gt;
&lt;p&gt;Korzystanie z wielu usług wbudowanych w tzw. ekosystem Apple jeszcze nie jest tak boleśnie przymusowe, jak w smartfonach z Androidem, ale Apple jest już na równi pochyłej. Mocno rozpędzone. O tym za chwilę.&lt;/p&gt;
&lt;p&gt;Smartfon z Androidem. Chciałem odetchnąć, wyrwać się na chwilę z chmurowych objęć Apple, odstawić iPhone. To była Nokia, co nie ma znaczenia, z Androidem One czyli "czyściutkim" systemem, charakteryzujacym się częstymi aktualizacjami.&lt;/p&gt;
&lt;p&gt;Niemal od razu wpadłem w matnię Google.&lt;/p&gt;
&lt;p&gt;Miałem już wcześniej doświadczenia z Nokią od Microsoftu, na którą nie dało się wgrać kontaktów, bez przekazania ich do firmowej chmury. Byłem więc przygotowany, przeżyłem ciężki poligon. Pilnowałem każdego kroku, oczekując w zamian, że ten telefon będzie mój.&lt;/p&gt;
&lt;p&gt;Niemal straciłem... pracę.&lt;/p&gt;
&lt;p&gt;Po wyłączeniu lub zablokowaniu wszystkich usług Google (główna, Services, co kilkanaście minut dawała znać, że chce żyć własnym życiem i wystawiała łeb wyskakujacym pop-upem) telefon przestał być smartfonem. Stał się obciążającą kieszeń cegłą. Fakt, że ktoś dzwoni oznajmiał kiedy chciał. A często dzwonił prezes. Coraz bardziej zniecierpliwiony moją telefoniczną absencją. Pozbyłem się go z obrzydzeniem, telefonu, nie prezesa, bo nie dał się zrootować, nie było też alternatywy dla OS-a.&lt;/p&gt;
&lt;p&gt;Wróciłem do iPhone'a. Tak, mam wyłączone niemal wszystkie wynalazki Apple. Tak, wiem że ułatwiają życie. Ale ja nie pragnę mieć łatwiej! Ja chcę, żeby sprzęt słuchał mnie! Tylko tyle.&lt;/p&gt;
&lt;p&gt;Wyłączone &lt;strong&gt;NIEMAL&lt;/strong&gt; wszystkie... Zostawiłem w iCloud coś co Apple nazywa "Chmurą rodzinną". Wiecie... Takie coś, że jak doda się do tego urządzenia dzieci to można zarządzać czasem spędzanym przy telefonie. Nie jestem idiotą więc wszystkie dane podane do Apple, niestety za wyjątkiem numerów telefonów, były, są i będą fałszywe. Tak, wiem że i tak wiedzą. To jeszcze z czasów kiedy im ufałem.&lt;/p&gt;
&lt;p&gt;"Chmura rodzinna".&lt;/p&gt;
&lt;p&gt;Zapomnieli dopisać, że to &lt;strong&gt;ICH&lt;/strong&gt; rodzina. Ja już tu nie mam nic do gadania. Próbowałem usunąć dzieci z tej chmury. Nie było sposobu. Dopóki nie skończą 16 lat, po prostu się nie da. Telefon do obsługi firmy tylko potwierdził tę smutną konstatację. Dodałeś, jak ja, dzieci do chmury? To już są ICH dzieci, to oni decydują co z nimi możesz zrobić. A możesz najwyżej poczekać parę lat albo przekazać do innej chmury. Innej? Ja chcę je odzyskać!&lt;/p&gt;
&lt;p&gt;A słyszeliście o pomyśle Microsoftu, który ma zamiar blokować instalowanie innych systemów operacyjnych na laptopach z Windows? Wiem, że wielu z was nic to nie obchodzi. I, że M$ ma prawo to robić. To odpowiedź godna raba.&lt;/p&gt;
&lt;p&gt;Dziś instalowałem znajomemu Windows 11, w trybie Home nie da się dokończyć instalacji bez zakładania konta w Microsofcie. W dodatku trzeba być online. Serio? Czy to co kupiłem jest moje czy częściowo moje?&lt;/p&gt;
&lt;p&gt;A kto nas pyta czy chcemy na nowym sprzęcie tony bloatware'u? A po co mi Ms Office kiedy nie używam?&lt;/p&gt;
&lt;p&gt;Po kiego diabła mi newsy na Desktopie? Może nie chcę się w ogóle łączyć z tym g. jakim się stały serwisy wiadomości?&lt;/p&gt;
&lt;p&gt;Słowa, słowa, słowa... tak mówił taki jeden, wydaje się że nazbyt normalny, tam wśród zdrajców i morderców, a ja wśród niewolników.&lt;/p&gt;
</content><category term="Wypociny"></category><category term="linux"></category><category term="macbook"></category></entry><entry><title>A cholera wie</title><link href="https://scyzoryk.fubar.pl/a_cholera_wie.html" rel="alternate"></link><published>2023-05-19T10:44:00+02:00</published><updated>2023-05-19T10:44:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2023-05-19:/a_cholera_wie.html</id><content type="html">&lt;div class="docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/12/Zrzut-ekranu-2021-01-2-o-09.28.01.png"&gt;&lt;img alt="image1" src="/uploads/2022/12/Zrzut-ekranu-2021-01-2-o-09.28.01.png"/&gt;&lt;/a&gt;&lt;/div&gt;
</content><category term="Shitz"></category></entry><entry><title>[Encrypted] Co by było?</title><link href="https://scyzoryk.fubar.pl/co-by-bylo.html" rel="alternate"></link><published>2023-03-03T08:44:00+01:00</published><updated>2023-03-03T08:44:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-03-03:/co-by-bylo.html</id><summary type="html">Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;KvPsypBu8GsBsashqcj1OQ==;YpV5PCMHd0Sv0bjoLnnvPvDV4vssJDBQwXm+no4ns6cAOGRlbzi6RAKDC47wavM5LzsfoQRpzSKIZqwpNjHOYgOC+kWEebqYoeQRB6jMPiTqPhG4JQMFQohA97GJausm0hjzjjfV66v+m8mIuGmPtwJH/FmVAID47CcREpWZDxlmU/iMZ11e0PIQVAlUqgXZqtfNSViHiAV8QBenn6ovL7ZbC7Wp2MyRBOMI4vMT6dqyfUCUzKJJeWWWnuFNUK3pIl5wRwK7WKjtuUotEwLIFhsiqQ2sgiJnTAoE8fNBIwaNg8M+VVqiIIAjXE9nkEeXywmIuhyFyMlLK9tV9y+MMvEfEuYFdNloFEO5ycgepVoPKwiXtA/tLCYe7Z/XiP55YdWB299pfO3nHFwIuAsz37LTzUTT3Sj1NCeHDVwj/uOpUJryZfkru1NSawLsDWdIcmcjxHtiKPGbJe8YTtS7JZRz3YJSXYhqvfH+KazVH+7wya1TKGFPrsLAjUfuSQONjL+kEoVL2aGttWAz5czLmKod1l3p2g/try1b4DD4fbs30YaSb2RVmhDzmxobDYgkI7A284cfbBQAEdB7AuXB6FY6M0HSGjbIBMP3bz4oVBX21fR3dKvmtISiOtTUS71Fedyic5XI0f2Pam/5UP3ypzSNZZG37W1G5it/7qHHhQP9jTkdvcjsvVy+WJUgxNL+HrpyYPVRUj5A7HdNhJdfb2U7jAEVpmaA/E9YpraHarY/I0v7jIhoQt91CdDnYxEuavC7SEROAD2fhZ0m0ccVgQJbM1L4RXItX0LO//UC3OUOAJXH/gjUP7rplUGG/7rrBlqAs7ihk2GjXS02YQVngOs5hVvkiZw5pr4jXe0gALHQQcc8Qa1B/rQV9XMEzlfgQSDqVn2lBZD5D49ycAIwkEHYVOlwW69V2SwOR/7plvw=;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="Shitz"></category><category term="shitz"></category><category term="polityka"></category></entry><entry><title>Komputer idealny</title><link href="https://scyzoryk.fubar.pl/komputer_idealny.html" rel="alternate"></link><published>2023-02-14T19:31:00+01:00</published><updated>2023-02-14T19:31:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-02-14:/komputer_idealny.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jak dla kogo?&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Spis narzędzi:&lt;/div&gt;
&lt;div class="line"&gt;nnn - &lt;a class="reference external" href="https://github.com/jarun/nnn"&gt;https://github.com/jarun/nnn&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;fzf - &lt;a class="reference external" href="https://www.linux.pl/2022/05/22/fzf-uniwersalne-wyszukiwanie/"&gt;https://www.linux.pl/2022/05/22/fzf-uniwersalne-wyszukiwanie/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;signal-cli&lt;/div&gt;
&lt;div class="line"&gt;xmonad&lt;/div&gt;
&lt;div class="line"&gt;xmobar&lt;/div&gt;
&lt;div class="line"&gt;restic&lt;/div&gt;
&lt;div class="line"&gt;chezmoi&lt;/div&gt;
&lt;div class="line"&gt;rofi&lt;/div&gt;
&lt;div class="line"&gt;nextcloud&lt;/div&gt;
&lt;div class="line"&gt;fluxgui&lt;/div&gt;
&lt;div class="line"&gt;rsibreak&lt;/div&gt;
&lt;div class="line"&gt;trayer&lt;/div&gt;
&lt;div class="line"&gt;caffeine&lt;/div&gt;
&lt;div class="line"&gt;dispad / synclient&lt;/div&gt;
&lt;div class="line"&gt;st&lt;/div&gt;
&lt;div class="line"&gt;alacritty&lt;/div&gt;
&lt;div class="line"&gt;tridactyl&lt;/div&gt;
&lt;div class="line"&gt;obsidian&lt;/div&gt;
&lt;div class="line"&gt;pavucontrol&lt;/div&gt;
&lt;div class="line"&gt;zathura&lt;/div&gt;
&lt;div class="line"&gt;nomacs&lt;/div&gt;
&lt;div class="line"&gt;scrot&lt;/div&gt;
&lt;div class="line"&gt;sigil&lt;/div&gt;
&lt;div class="line"&gt;khal …&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jak dla kogo?&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Spis narzędzi:&lt;/div&gt;
&lt;div class="line"&gt;nnn - &lt;a class="reference external" href="https://github.com/jarun/nnn"&gt;https://github.com/jarun/nnn&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;fzf - &lt;a class="reference external" href="https://www.linux.pl/2022/05/22/fzf-uniwersalne-wyszukiwanie/"&gt;https://www.linux.pl/2022/05/22/fzf-uniwersalne-wyszukiwanie/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;signal-cli&lt;/div&gt;
&lt;div class="line"&gt;xmonad&lt;/div&gt;
&lt;div class="line"&gt;xmobar&lt;/div&gt;
&lt;div class="line"&gt;restic&lt;/div&gt;
&lt;div class="line"&gt;chezmoi&lt;/div&gt;
&lt;div class="line"&gt;rofi&lt;/div&gt;
&lt;div class="line"&gt;nextcloud&lt;/div&gt;
&lt;div class="line"&gt;fluxgui&lt;/div&gt;
&lt;div class="line"&gt;rsibreak&lt;/div&gt;
&lt;div class="line"&gt;trayer&lt;/div&gt;
&lt;div class="line"&gt;caffeine&lt;/div&gt;
&lt;div class="line"&gt;dispad / synclient&lt;/div&gt;
&lt;div class="line"&gt;st&lt;/div&gt;
&lt;div class="line"&gt;alacritty&lt;/div&gt;
&lt;div class="line"&gt;tridactyl&lt;/div&gt;
&lt;div class="line"&gt;obsidian&lt;/div&gt;
&lt;div class="line"&gt;pavucontrol&lt;/div&gt;
&lt;div class="line"&gt;zathura&lt;/div&gt;
&lt;div class="line"&gt;nomacs&lt;/div&gt;
&lt;div class="line"&gt;scrot&lt;/div&gt;
&lt;div class="line"&gt;sigil&lt;/div&gt;
&lt;div class="line"&gt;khal / vdirsyncer&lt;/div&gt;
&lt;div class="line"&gt;alpine - do poczty&lt;/div&gt;
&lt;div class="line"&gt;qalc&lt;/div&gt;
&lt;div class="line"&gt;-------&lt;/div&gt;
&lt;div class="line"&gt;Android:&lt;/div&gt;
&lt;div class="line"&gt;tmuxer - żeby po SSH wysyłać SMS-y&lt;/div&gt;
&lt;div class="line"&gt;signal-cli - żeby ogarniać zdalnie Signal&lt;/div&gt;
&lt;div class="line"&gt;ntfy.sh&lt;/div&gt;
&lt;/div&gt;
</content><category term="Programowanie"></category></entry><entry><title>Grafana + Prometheus + Proxmox czyli prezentacja metryk z serwera</title><link href="https://scyzoryk.fubar.pl/grafana-prometheus-proxmox.html" rel="alternate"></link><published>2023-02-11T00:36:00+01:00</published><updated>2023-02-11T00:36:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2023-02-11:/grafana-prometheus-proxmox.html</id><summary type="html">&lt;p&gt;Najszybciej na świecie uruchomić Grafanę i Prometheusa można za pomocą kontenerów.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;IP maszyny z Proxmoxem: 192.168.1.2&lt;/div&gt;
&lt;div class="line"&gt;IP maszyny z Grafaną i Prometheusem: 192.168.1.1&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Na maszynie 192.168.1.1 mam Dockera, odpalam na niej kontenery z Grafaną i Prometeuszem.&lt;/p&gt;
&lt;div class="section" id="grafana"&gt;
&lt;h2&gt;Grafana&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;grafana.yml&lt;/div&gt;
&lt;div class="line"&gt;docker-compose -f …&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Najszybciej na świecie uruchomić Grafanę i Prometheusa można za pomocą kontenerów.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;IP maszyny z Proxmoxem: 192.168.1.2&lt;/div&gt;
&lt;div class="line"&gt;IP maszyny z Grafaną i Prometheusem: 192.168.1.1&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Na maszynie 192.168.1.1 mam Dockera, odpalam na niej kontenery z Grafaną i Prometeuszem.&lt;/p&gt;
&lt;div class="section" id="grafana"&gt;
&lt;h2&gt;Grafana&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;grafana.yml&lt;/div&gt;
&lt;div class="line"&gt;docker-compose -f grafana.yml up -d&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
version: '3'

volumes:
  grafana-data:
    driver: local

services:
  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    restart: unless-stopped
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="prometheus"&gt;
&lt;h2&gt;Prometheus&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;prometheus.yml&lt;/div&gt;
&lt;div class="line"&gt;docker-compose -f prometheus.yml up -d&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
version: '3'

volumes:
  prometheus-data:
    driver: local

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - /etc/prometheus:/etc/prometheus
      - prometheus-data:/prometheus
    restart: unless-stopped
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
&lt;/pre&gt;
&lt;p&gt;W /etc/prometheus/prometheus.yml:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
global:
  scrape_interval:     15s

# sam prometeusz we własnej osobie
scrape_configs:
  - job_name: 'prometheus'
    # tu nadpisujemy domyślny interwał czasowy
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']
# a tu Proxmox
  - job_name: 'My Proxmox'
    metrics_path: /pve
    static_configs:
      - targets: ['192.168.1.2:9221']
&lt;/pre&gt;
&lt;p&gt;Na maszynie z Proxmoxem instaluję Python3 oraz eksporter danych Proxmoxa do Prometeusza. Dodaję też użytkownika, na którego uprawnieniach będzie działał eksporter.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
apt install python3 python3-pip
pip3 install prometheus-pve-exporter
mkdir /etc/prometheus
groupadd --system prometheus
useradd -s /sbin/nologin --system -g prometheus prometheus
&lt;/pre&gt;
&lt;p&gt;W Proxmoxie tworzę grupę 'auditors', dodaję użytkownika 'prometheus' i dodaję do tej grupy. Tworzę Token API o nazwie 'prometheus' dla tego użytkownika. Zapisuję jego wartość, będzie zaraz potrzebna.&lt;/p&gt;
&lt;p&gt;Dodaje uprawnienia, a właściwie rolę PVEAuditors (w opcjach: Permisions) dla użytkownika.&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
pveum&lt;span class="w"&gt; &lt;/span&gt;acl&lt;span class="w"&gt; &lt;/span&gt;modify&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;-user&lt;span class="w"&gt; &lt;/span&gt;prometheus@pve&lt;span class="w"&gt; &lt;/span&gt;-role&lt;span class="w"&gt; &lt;/span&gt;PVEAuditor
&lt;/pre&gt;
&lt;p&gt;Do pliku: /etc/prometheus/pve.yml wpisuję:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
default:
  user: prometheus@pve
  token_name: "prometheus"
  token_value: "3f416134-f0f0-ff5-00f3-002d00ffc00b"
  verify_ssl: false
&lt;/pre&gt;
&lt;p&gt;Linia 'token_value' zawiera wartość tokenu wspomnianą wyżej.&lt;/p&gt;
&lt;p&gt;Tworzę plik dla systemd w /etc/systemd/system/prometheus-pve-exporter.service o następującej zawartości:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Unit]
Description=Prometheus exporter for Proxmox VE
Documentation=https://github.com/znerol/prometheus-pve-exporter

[Service]
Restart=always
User=prometheus
ExecStart=/usr/local/bin/pve_exporter /etc/prometheus/pve.yml

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;
&lt;p&gt;Odświeżam konfig systemd:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl daemon-reload
&lt;/pre&gt;
&lt;p&gt;Odpalam eksporter i sprawdzam czy działa:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl start prometheus-pve-exporter
systemctl status prometheus-pve-exporter
&lt;/pre&gt;
&lt;p&gt;Jeśli jest OK, to włączam automatyczny start:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl enable prometheus-pve-exporter
&lt;/pre&gt;
&lt;p&gt;Na maszynie z Proxmoxem na porcie 9221, eksporter wypluwa metryki, można to sobie obejrzeć:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
http://192.168.1.2:9221/pve?target=192.168.1.2
&lt;/pre&gt;
&lt;p&gt;W Grafanie dodaję 'Data Source' i wybieram 'Prometheus'. W polu URL wpisuję adres maszyny: &lt;a class="reference external" href="http://192.168.1.1:9090"&gt;http://192.168.1.1:9090&lt;/a&gt;.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;W bocznym menu wybieram Import i w polu 'Import via Grafana.com' wpisuję liczbę: 10347.&lt;/div&gt;
&lt;div class="line"&gt;To jest szablon dashboardu do Proxmoxa, gotowiec. Klikam w 'Load', daję nazwę serwera z Proxmoxem i zachowuję nowy dashboard.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Wirtualizacja"></category><category term="monitoring"></category><category term="sieć"></category><category term="wirtualizacja"></category><category term="komunikacja"></category><category term="systemy"></category></entry><entry><title>Internet to gówniana historia</title><link href="https://scyzoryk.fubar.pl/internet_to_gowniana_historia.html" rel="alternate"></link><published>2022-12-13T10:50:00+01:00</published><updated>2022-12-13T10:50:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-12-13:/internet_to_gowniana_historia.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Siedzę w Internecie od jego początków w Polsce, tak się złożyło że pracowałem w firmie, która pierwsza sprzedawała komercyjny dostęp do Internetu. To były łącza komutowane. Firma nazywała się Internet Technologies i prowadził ją człowiek z uśmiechem robota: Rafał Plutecki. Do gościa nic …&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Siedzę w Internecie od jego początków w Polsce, tak się złożyło że pracowałem w firmie, która pierwsza sprzedawała komercyjny dostęp do Internetu. To były łącza komutowane. Firma nazywała się Internet Technologies i prowadził ją człowiek z uśmiechem robota: Rafał Plutecki. Do gościa nic nie mam, był OK, miał może małe umiejętności interpersonalne ale pociągnął i rozwinął tę firmę na poziom korpo. Inna historia.&lt;/div&gt;
&lt;div class="line"&gt;Wykazałem więc już, że z racji doświadczenia coś tam o Internecie wiem. Robię tak świadomie, taki zabieg marketingowy, żeby dobitniej brzmieć bo to co mam do powiedzenia jest nieco obrazoburcze.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Internet, traktowany jako całość, doskonale odzwierciedla nasze, ludzkie ułomności. Jeśli ktoś, jak ja, spodziewał się, że będzie to baza mądrości to jest w błędzie - to jest baza gówna. Na szczęście tylko w większości. "Na szczęście" - bo istnieje też mniejszość czyli coś co ma wartość.&lt;/p&gt;
&lt;p&gt;Piszę słowa niniejsze w formie, z założenia, niewysłuchanego apelu, cichnącego krzyku na pustyni, licząc że echo, kolejne odbicie, dotrze do łaskawych uszu.&lt;/p&gt;
&lt;p&gt;Zachowujcie tę mniejszość. Kopiujcie to co wartościowe. Wartościowe wg Was. Jasne, że dla kogoś kto lubi kotki, kotki będą warte zachowania, a dla mnie wzardy, chociaż wydaje mi się, że nawet na poziomie kotka można znaleźć jakąś wartość. Kto wie?&lt;/p&gt;
&lt;p&gt;Sporo z moich bookmarków (zakładek) prowadzi już donikąd. Zniknęły. I będą znikać jeśli pasjonaci wartości nie użyją swoich zasobów do ich zachowania. Wiem, to kosztuje i pieniądze i czas. Ale warto.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Duplikujmy Wartość, utrzymujmy chociaż ten 1% w morzu ekstrementów.&lt;/div&gt;
&lt;div class="line"&gt;Dalej już tylko nadzieja...&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;p.s.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Nie zamierzałem tego ale szukając ilustracji do powyższych wynurzeń wpisałem dwa słowa kluczowe: "światłość mądrość" w wyszukiwarki grafik. Sprawdź co ty dostanesz:&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://duckduckgo.com/?q=%C5%9Bwiat%C5%82o%C5%9B%C4%87+m%C4%85dro%C5%9B%C4%87&amp;amp;t=ffab&amp;amp;iar=images&amp;amp;iax=images&amp;amp;ia=images"&gt;duckduckgo&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://www.google.com/search?q=%C5%9Bwiat%C5%82o%C5%9B%C4%87+m%C4%85dro%C5%9B%C4%87&amp;amp;source=lnms&amp;amp;tbm=isch&amp;amp;sa=X&amp;amp;ved=2ahUKEwjWi8e2mvb7AhUWCBAIHc23Cn8Q_AUoAXoECAEQAw&amp;amp;biw=1452&amp;amp;bih=879"&gt;google&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;p.p.s.&lt;/div&gt;
&lt;div class="line"&gt;Ta jeszcze żyje: &lt;a class="reference external" href="https://jmn.pl/antykwa-torunska/"&gt;Antykwa Toruńska&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ta też: &lt;a class="reference external" href="https://blog-techniczny.pl/2021/01/09/x-praktycznych-porad-zwiazanych-z-projektami-arduino-i-esp/"&gt;24 praktyczne porady związane z projektami Arduino i ESP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I ta: &lt;a class="reference external" href="https://wynalazki.andrej.edu.pl/"&gt;Wynalazki i odkrycia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ta też: &lt;a class="reference external" href="http://www.autonom.edu.pl/"&gt;Autonom&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I ta: &lt;a class="reference external" href="https://www.matemaks.pl/"&gt;Matemaks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A zobacz ile z tych już umarło: &lt;a class="reference external" href="https://eduinf.waw.pl/inf/alg/007_wwwbelfer/index.php"&gt;https://eduinf.waw.pl/inf/alg/007_wwwbelfer/index.php&lt;/a&gt; mimo, że zostało przeniesione z &lt;a class="reference external" href="http://edu.i-lo.tarnow.pl/index.php"&gt;Serwisu Edukacyjnego I LO w Tarnowie&lt;/a&gt;&lt;/p&gt;
</content><category term="Wypociny"></category><category term="światopogląd"></category></entry><entry><title>Certbot i OVH</title><link href="https://scyzoryk.fubar.pl/certbot-i-ovh.html" rel="alternate"></link><published>2022-12-12T22:31:00+01:00</published><updated>2022-12-12T22:31:00+01:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2022-12-12:/certbot-i-ovh.html</id><summary type="html">&lt;p&gt;Odnawianie certyfikatów Letsencrypt na hostach schowanych za firewallem może być przyjemne trzeba to zrobić raz i porządnie.&lt;/p&gt;
&lt;p&gt;Dlaczego w ogóle istnieje ten problem i czego dotyczy? W moim przypadku najczęściej serwerów pocztowych, które nie tylko znajdują się firewallem ale na które nie mogę dynamicznie przekierować portów 80 i 443, aby …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Odnawianie certyfikatów Letsencrypt na hostach schowanych za firewallem może być przyjemne trzeba to zrobić raz i porządnie.&lt;/p&gt;
&lt;p&gt;Dlaczego w ogóle istnieje ten problem i czego dotyczy? W moim przypadku najczęściej serwerów pocztowych, które nie tylko znajdują się firewallem ale na które nie mogę dynamicznie przekierować portów 80 i 443, aby odpowiedzieć na żądanie z Letsencrypt.&lt;/p&gt;
&lt;p&gt;Ale po co przekierowywać te porty? Bo wystawianie nowego certyfikatu to proces składający się z kilku etapów w których wymieniana jest informacja między hostem, a serwerem Letsencrypt (LE). Komunikacja odbywa się przez porty 80 i 443.&lt;/p&gt;
&lt;p&gt;W skrócie: w pewnym momencie serwer LE chce "pogadać" z serwerem HTTP na hoście na który wskazuje rekord DNS domeny, dla której wystawiamy nowy certyfikat (lub go odnawiamy), żeby przekonać się, że mamy do tego prawo. A prawo mamy jeśli jesteśmy adminem tego serwera.&lt;/p&gt;
&lt;p&gt;No, ale co zrobić jeśli na firewallu porty 80 i 443 już są przekierowane na innego hosta?&lt;/p&gt;
&lt;p&gt;Jeśli domena utrzymywana jest u dostawcy obsługiwanego modułem Certbota, sprawę mamy załatwioną bo innym sposobem autoryzacji jest udowodnienie, że mamy prawo do ustawiania rekordów DNS dla tej domeny.&lt;/p&gt;
&lt;p&gt;Jeśli DNS obsługiwany jest przez OVH to problem rozwiązuje moduł do Certbota o nazwie: &lt;strong&gt;certbot-dns-ovh&lt;/strong&gt;. Metoda jest prosta, najpierw modułowi zezwalamy na dostęp do API w OVH, dzięki temu może on dopisywać i usuwać rekordy w DNS. Rekordy te służą poświadczeniu, że my to rzeczywiście my i że mamy prawo poprosić o nowy certyfikat.&lt;/p&gt;
&lt;div class="section" id="instalujemy-certbota-zrodlem-niech-bedzie-snap-paczkowany-bywa-zbyt-stary"&gt;
&lt;h2&gt;Instalujemy certbota (źródłem niech będzie &lt;strong&gt;SNAP&lt;/strong&gt;, "paczkowany" bywa zbyt stary).&lt;/h2&gt;
&lt;p&gt;Tu instaluję na Debianie 10 (buster), inne distra mają podobnie.&lt;/p&gt;
&lt;p&gt;Najpierw snap i certbot:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo apt update
sudo apt install snapd
sudo snap install core
sudo snap refresh core
sudo apt remove certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
&lt;/pre&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="kontener-w-proxmoxie-ma-inaczej"&gt;
&lt;h2&gt;Kontener w Proxmoxie ma inaczej&lt;/h2&gt;
&lt;p&gt;W kontenerze na Proxmoxie powyższa instalacja nie powiedzie się, można kombinować z ustawieniami 'fuse':&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Snap requires a bit more work. There may soon be a 'fuse' flag for the features option, but fuse can be dangerous. For now you have to do this:&lt;/div&gt;
&lt;div class="line"&gt;- For unprivileged containers:&lt;/div&gt;
&lt;div class="line"&gt;1) Put this in /etc/pve/lxc/$vmid.conf:&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
...
features: mount=fuse,nesting=1
lxc.mount.entry = /dev/fuse dev/fuse none bind,create=file 0 0
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;2) Inside the container: `apt install squashfuse`&lt;/div&gt;
&lt;div class="line"&gt;- For privileged containers, also add:&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
...
# EDIT:
# We need to allow apparmor administration, by default mac_admin is dropped for privileged containers.
# Note that you do not want this for un-trusted containers...
lxc.cap.drop =
lxc.cap.drop = mac_override sys_time sys_module sys_rawio
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Alternatively to squashfuse, privileged containers could use loop devices, but I wouldn't recommend it...&lt;/div&gt;
&lt;div class="line"&gt;Note that enabling `fuse` in a container does not play well with backups, or anything that causes an `lxc-freeze` command to be executed on the container, as this can cause deadlocks in the kernel.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://forum.proxmox.com/threads/ubuntu-snaps-inside-lxc-container-on-proxmox.36463/#post-230060"&gt;https://forum.proxmox.com/threads/ubuntu-snaps-inside-lxc-container-on-proxmox.36463/#post-230060&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ale wolę szybsze i bezpieczniejsze rozwiązanie czyli instalacja za pomocą PIP:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo apt-get remove certbot
sudo apt update
sudo apt install python3 python3-venv libaugeas0
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot certbot
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
&lt;/pre&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="modul-node-do-ovh"&gt;
&lt;h2&gt;Moduł Node do OVH&lt;/h2&gt;
&lt;p&gt;zainstalujmy go w &lt;strong&gt;/opt&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cd /opt
sudo git clone https://github.com/mcdado/certbot-dns-ovh.git
cd certbot-dns-ovh
&lt;/pre&gt;
&lt;p&gt;Moduł używa &lt;strong&gt;Node.js&lt;/strong&gt; więc pierwszym krokiem jest zainstalowanie &lt;strong&gt;Node&lt;/strong&gt; na naszym serwerze. Najlepszym sposobem jest ominięcie instalacji z paczek i użycie &lt;strong&gt;NVM&lt;/strong&gt;, a to ponieważ &lt;strong&gt;Node&lt;/strong&gt; podlega szybkim zmianom, wkrótce więc może okazać się, że jest nieaktualny.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NVM&lt;/strong&gt; to &lt;strong&gt;Node Version Manager&lt;/strong&gt;, nazwa wyjaśnia wszystko. Instalacja jest trywialna:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
&lt;/pre&gt;
&lt;p&gt;Następnie instalacja samego &lt;strong&gt;Node&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
nvm install node
&lt;/pre&gt;
&lt;p&gt;Domyślne instalowana jest najnowsza wersja, inne można wyświetlić tą komendą:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
nvm list-remote
&lt;/pre&gt;
&lt;p&gt;Mamy &lt;strong&gt;Node&lt;/strong&gt;, pora zrobić resztę pracy, po której będzie można zapomnieć o ręcznym odnawianiu certyfikatów.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="ovh-appkey-i-appsecret"&gt;
&lt;h2&gt;OVH: Appkey i AppSecret&lt;/h2&gt;
&lt;p&gt;Wchodzimy na ten adres: &lt;a class="reference external" href="https://eu.api.ovh.com/createApp/"&gt;https://eu.api.ovh.com/createApp/&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;logujemy się na konto z domeną i generujemy App Key oraz App Secret. Pola "nazwa" oraz "opis" służą nam, ludziom, do pamiętania czemu służy konkretny klucz.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Teraz następuje kolejny krok autoryzacji aplikacji, w konsoli, nadal w katalogu &lt;strong&gt;/opt/certbot-dns-ovh&lt;/strong&gt; odpalamy:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
node bin/authorize.js --endpoint=ovh-eu --app_key=yourappkey --app_secret=yourappsecret

Jeśli wystąpi błąd mówiący o braku modułu "dotenv" należy go zainstalować:

.. code:: html

   npm install dotenv
&lt;/pre&gt;
&lt;p&gt;Oczywiście w miejsce "yourappkey" i "yourappsecret" podstawiamy &lt;strong&gt;App Key&lt;/strong&gt; i App Secret z poprzedniego kroku.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
W konsoli pojawia się odpowiedź, mniej więcej taka:
{ validationUrl: 'https://eu.api.ovh.com/auth/?credentialToken=jed…', consumerKey: '69X…', state: 'pendingValidation' }
&lt;/pre&gt;
&lt;p&gt;Zapamiętujemy klucz klienta (&lt;strong&gt;consumerKey&lt;/strong&gt;). Kopiujemy URL do przeglądarki i zatwierdzamy dostęp do API, wybieramy też przez jaki czas dane te będą ważne. Sam wybrałem, że w nieskończoność bo... tak.&lt;/p&gt;
&lt;p&gt;Znajdujący się w katalogu: &lt;strong&gt;/opt/certbot-dns-ovh&lt;/strong&gt; plik &lt;strong&gt;.env.example&lt;/strong&gt; kopiujemy do &lt;strong&gt;.env&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cd /opt/certbot-dns-ovh
cp .env.example .env
&lt;/pre&gt;
&lt;p&gt;Edytujemy &lt;strong&gt;.env&lt;/strong&gt;, wstawiając odpowiednie wartości uzyskane we wcześniejszych krokach:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
OVH_ENDPOINT="ovh-eu"
OVH_APP_KEY="tutaj klucz czyli App Key"
OVH_APP_SECRET="tu sekret App Secret"
OVH_CUSTOMER_KEY="klucz kienta czyli consumerKey wyświetlony w konsoli"
DNS_TIMEOUT="tu możemy zwiększyć czas oczekiwania z domyślnych 60 sekund"
&lt;/pre&gt;
&lt;p&gt;Przedostatni krok to uzyskanie certyfikatu, jeśli się powiedzie to mamy potwierdzenie, że nic nie spapraliśmy:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo certbot certonly --manual --preferred-challenges=dns --manual-auth-hook '/opt/certbot-dns-ovh/bin/create-record.js' --manual-cleanup-hook '/opt/certbot-dns-ovh/bin/delete-record.js' -d mojadomena.pl -d www.mojadomena.pl
&lt;/pre&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="odnawianie-cron-i-systemd"&gt;
&lt;h2&gt;Odnawianie: cron i systemd&lt;/h2&gt;
&lt;p&gt;Jeśli się udało to za pomocą komendy:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo crontab -e
&lt;/pre&gt;
&lt;p&gt;edytujemy &lt;strong&gt;crontaba&lt;/strong&gt; i wstawiamy na końcu linijkę:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
@weekly certbot renew --quiet
&lt;/pre&gt;
&lt;p&gt;czyli jako root uruchamiamy:&lt;/p&gt;
&lt;p&gt;crontab -e&lt;/p&gt;
&lt;p&gt;i wklejamy powyższą linijkę.&lt;/p&gt;
&lt;p&gt;W nowych "linuksach" crontab nie zawsze działa, zamieszczam więc poniżej wersję dla systemd.&lt;/p&gt;
&lt;p&gt;Plik: /etc/systemd/system/certbot-renewal.service:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Unit]
Description=Certbot Renewal

[Service]
ExecStart=/usr/bin/certbot renew
&lt;/pre&gt;
&lt;p&gt;Plik: /etc/systemd/system/certbot-renewal.timer (odpala certbot-renewal co tydzień):&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Unit]
Description=Timer for Certbot Renewal

[Timer]
OnBootSec=300
OnUnitActiveSec=1w

[Install]
WantedBy=multi-user.target
&lt;/pre&gt;
&lt;p&gt;I jeszcze plik: /etc/letsencrypt/renewal-hooks/post/00-restart-mail.sh, któremy należy nadać bit uruchomienia:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/bash
systemctl restart postfix
systemctl restart dovecot.service
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/00-restart-mail.sh
&lt;/pre&gt;
&lt;p&gt;Po skopiowaniu powyższych plików należy odświeżyć konfigurację systemd:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl daemon-reload
&lt;/pre&gt;
&lt;p&gt;No i zostaje uruchomienie serwisu:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl start certbot-renewal.timer
systemctl enable certbot-renewal.timer
&lt;/pre&gt;
&lt;p&gt;Aby sprawdzić czy timer działa:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl status certbot-renewal.timer
&lt;/pre&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="jak-to-sie-dzieje-ze-po-tych-zabiegach-cerbot-juz-wie-jak-odnawiac-certyfikaty"&gt;
&lt;h2&gt;Jak to się dzieje, że po tych zabiegach Cerbot już "wie" jak odnawiać certyfikaty?&lt;/h2&gt;
&lt;p&gt;Potrafi to, bo w katalogu &lt;strong&gt;/etc/letsencrypt/renewal&lt;/strong&gt; powstaje plik z konfiguracją. Nosi on nazwę domeny z końcówką .conf. Czyli w przypadku domeny mojadomena.pl będzie to:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
/etc/letsencrypt/renewal/mojadomena.pl.conf
&lt;/pre&gt;
&lt;p&gt;Zajrzyj do środka do zrozumiesz.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Linux"></category><category term="certbot"></category><category term="linux"></category><category term="mail"></category><category term="ovh"></category><category term="server"></category></entry><entry><title>Streaming from RTMP device to SRT listener</title><link href="https://scyzoryk.fubar.pl/streaming-from-rtmp-device-to-srt-listener.html" rel="alternate"></link><published>2022-11-14T14:46:00+01:00</published><updated>2022-11-14T14:46:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-11-14:/streaming-from-rtmp-device-to-srt-listener.html</id><summary type="html">&lt;p&gt;Supose you have device like LiveU Solo or one of very popular chinese video encoders, those devices do not support SRT protocol so if you want stream to vMix you must find solution.&lt;/p&gt;
&lt;p&gt;Generally you need to create some kind of middleware that will ingest RTMP stream and push it …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Supose you have device like LiveU Solo or one of very popular chinese video encoders, those devices do not support SRT protocol so if you want stream to vMix you must find solution.&lt;/p&gt;
&lt;p&gt;Generally you need to create some kind of middleware that will ingest RTMP stream and push it to SRT Listener in vMix.&lt;/p&gt;
&lt;p&gt;You can set up nginx with nginx_rtmp module on server and ask nginx to restream video to web page with embedded HTML5 player. Then you can get it with vMix web browser input. But you can expect loss of quality.&lt;/p&gt;
&lt;p&gt;Better way is to compile FFmpeg with SRT support and then ingest RTMP and restream with SRT:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
git clone https://github.com/Haivision/srt.git
cd srt
./configure
make &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install
sudo apt -y install libssl-dev tclsh
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Then get sources of FFmpeg as descibed there: &lt;a class="reference external" href="https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu"&gt;https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;but add following directive to configure before compiling:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
./configure --enable-libsrt ...
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;But even better option is to create Docker container with all stuff prepared and ready to ingest and restream.&lt;/div&gt;
&lt;div class="line"&gt;Supose your SRT converter is a Linux machine accessible at myserver.com domain and your vMix machine is behind firewall at my_vmix.com.&lt;/div&gt;
&lt;div class="line"&gt;On myserver.com you need to run following shell script which pulls and starts Docker image with SRT capable version of FFmpeg:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/sh
docker run --restart=unless-stopped -d --name=my_srt_converter -p 1935:1935 eyevinntechnology/toolbox-srttx --passthrough --inputtype=rtmp my_stream my_vmix.com:6001
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;As you can see it runs container which waits for RTMP stream on 1935 port then restream it to my_vmix.com on port 6001. This port on firewall redirects SRT stream to local vMix machine with SRT Listener waiting.&lt;/div&gt;
&lt;div class="line"&gt;In my case local machine is 192.168.1.10 and SRT Listener has port 5000.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;So everything looks like this:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="float wp-block-image size-full docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/11/Diagram-bez-tytulu.drawio-1.png"&gt;&lt;img alt="image1" class="wp-image-1699" src="/uploads/2022/11/Diagram-bez-tytulu.drawio-1.png"/&gt;&lt;/a&gt;&lt;/div&gt;
</content><category term="Multimedia"></category><category term="streaming"></category><category term="nginx"></category><category term="ffmpeg"></category><category term="docker"></category></entry><entry><title>Analiza tekstu piosenki Dawida Podsiadło pt. "Post"</title><link href="https://scyzoryk.fubar.pl/analiza-tekstu-piosenki-dawida-podsiadlow-pt-post.html" rel="alternate"></link><published>2022-10-24T22:27:00+02:00</published><updated>2022-10-24T22:27:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-10-24:/analiza-tekstu-piosenki-dawida-podsiadlow-pt-post.html</id><summary type="html">&lt;p&gt;Najpierw sam tekst:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
Czy&lt;span class="w"&gt; &lt;/span&gt;ona&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;nim&lt;span class="w"&gt; &lt;/span&gt;spała&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;było&lt;span class="w"&gt; &lt;/span&gt;bara&lt;span class="w"&gt; &lt;/span&gt;bara&lt;span class="w"&gt;
&lt;/span&gt;Wielce&lt;span class="w"&gt; &lt;/span&gt;ciekawi&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;staje&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;zakazach&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;płaci&lt;span class="w"&gt; &lt;/span&gt;każdy&lt;span class="w"&gt; &lt;/span&gt;mandat&lt;span class="w"&gt;
&lt;/span&gt;Na&lt;span class="w"&gt; &lt;/span&gt;pewno&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;płaci&lt;span class="w"&gt; &lt;/span&gt;alimenty&lt;span class="w"&gt;
&lt;/span&gt;Kupuje&lt;span class="w"&gt; &lt;/span&gt;im&lt;span class="w"&gt; &lt;/span&gt;prezenty&lt;span class="w"&gt;
&lt;/span&gt;Nie&lt;span class="w"&gt; &lt;/span&gt;wydaje&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;się&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;dalej&lt;span class="w"&gt; &lt;/span&gt;dużo&lt;span class="w"&gt; &lt;/span&gt;ćpa&lt;span class="w"&gt;
&lt;/span&gt;Jakie&lt;span class="w"&gt; &lt;/span&gt;tatuaże&lt;span class="w"&gt; &lt;/span&gt;ma&lt;span class="w"&gt;
&lt;/span&gt;Co&lt;span class="w"&gt; &lt;/span&gt;za&lt;span class="w"&gt; &lt;/span&gt;człowieka&lt;span class="w"&gt; &lt;/span&gt;wrak …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;Najpierw sam tekst:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
Czy&lt;span class="w"&gt; &lt;/span&gt;ona&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;nim&lt;span class="w"&gt; &lt;/span&gt;spała&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;było&lt;span class="w"&gt; &lt;/span&gt;bara&lt;span class="w"&gt; &lt;/span&gt;bara&lt;span class="w"&gt;
&lt;/span&gt;Wielce&lt;span class="w"&gt; &lt;/span&gt;ciekawi&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;staje&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;zakazach&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;płaci&lt;span class="w"&gt; &lt;/span&gt;każdy&lt;span class="w"&gt; &lt;/span&gt;mandat&lt;span class="w"&gt;
&lt;/span&gt;Na&lt;span class="w"&gt; &lt;/span&gt;pewno&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;płaci&lt;span class="w"&gt; &lt;/span&gt;alimenty&lt;span class="w"&gt;
&lt;/span&gt;Kupuje&lt;span class="w"&gt; &lt;/span&gt;im&lt;span class="w"&gt; &lt;/span&gt;prezenty&lt;span class="w"&gt;
&lt;/span&gt;Nie&lt;span class="w"&gt; &lt;/span&gt;wydaje&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;się&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;dalej&lt;span class="w"&gt; &lt;/span&gt;dużo&lt;span class="w"&gt; &lt;/span&gt;ćpa&lt;span class="w"&gt;
&lt;/span&gt;Jakie&lt;span class="w"&gt; &lt;/span&gt;tatuaże&lt;span class="w"&gt; &lt;/span&gt;ma&lt;span class="w"&gt;
&lt;/span&gt;Co&lt;span class="w"&gt; &lt;/span&gt;za&lt;span class="w"&gt; &lt;/span&gt;człowieka&lt;span class="w"&gt; &lt;/span&gt;wrak&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;A&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;poszczę&lt;span class="w"&gt; &lt;/span&gt;bo&lt;span class="w"&gt; &lt;/span&gt;piątek&lt;span class="w"&gt;
&lt;/span&gt;Więc&lt;span class="w"&gt; &lt;/span&gt;rybę&lt;span class="w"&gt; &lt;/span&gt;mam&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;obiad&lt;span class="w"&gt;
&lt;/span&gt;I&lt;span class="w"&gt; &lt;/span&gt;zemszczę&lt;span class="w"&gt; &lt;/span&gt;się&lt;span class="w"&gt; &lt;/span&gt;pomszczę&lt;span class="w"&gt;
&lt;/span&gt;Niesprawiedliwe&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;idiota&lt;span class="w"&gt;
&lt;/span&gt;Więc&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;poszczę&lt;span class="w"&gt; &lt;/span&gt;bo&lt;span class="w"&gt; &lt;/span&gt;piątek&lt;span class="w"&gt;
&lt;/span&gt;Na&lt;span class="w"&gt; &lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;straży&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;przy&lt;span class="w"&gt; &lt;/span&gt;wrotach&lt;span class="w"&gt;
&lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;weź&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;wpuszczaj&lt;span class="w"&gt; &lt;/span&gt;ich&lt;span class="w"&gt; &lt;/span&gt;Piotrek&lt;span class="w"&gt;
&lt;/span&gt;To&lt;span class="w"&gt; &lt;/span&gt;sama&lt;span class="w"&gt; &lt;/span&gt;jest&lt;span class="w"&gt; &lt;/span&gt;hołota&lt;span class="w"&gt;
&lt;/span&gt;Nie&lt;span class="w"&gt; &lt;/span&gt;będzie&lt;span class="w"&gt; &lt;/span&gt;żaden&lt;span class="w"&gt; &lt;/span&gt;Niemiec&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;inny&lt;span class="w"&gt; &lt;/span&gt;cudzoziemiec&lt;span class="w"&gt;
&lt;/span&gt;Co&lt;span class="w"&gt; &lt;/span&gt;dzień&lt;span class="w"&gt; &lt;/span&gt;spluwał&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;twarz&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Zabierz&lt;span class="w"&gt; &lt;/span&gt;te&lt;span class="w"&gt; &lt;/span&gt;Pottery&lt;span class="w"&gt;
&lt;/span&gt;Te&lt;span class="w"&gt; &lt;/span&gt;tęczowe&lt;span class="w"&gt; &lt;/span&gt;rowery&lt;span class="w"&gt;
&lt;/span&gt;Weź&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;wszystko&lt;span class="w"&gt; &lt;/span&gt;spal&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Zaczynam&lt;span class="w"&gt; &lt;/span&gt;dziś&lt;span class="w"&gt; &lt;/span&gt;odwierty&lt;span class="w"&gt;
&lt;/span&gt;Bo&lt;span class="w"&gt; &lt;/span&gt;węgiel&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;diamenty&lt;span class="w"&gt;
&lt;/span&gt;Zimą&lt;span class="w"&gt; &lt;/span&gt;będzie&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt; &lt;/span&gt;grzał&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Kobieto&lt;span class="w"&gt; &lt;/span&gt;weź&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;pyskuj&lt;span class="w"&gt;
&lt;/span&gt;Na&lt;span class="w"&gt; &lt;/span&gt;moim&lt;span class="w"&gt; &lt;/span&gt;świecie&lt;span class="w"&gt; &lt;/span&gt;dysku&lt;span class="w"&gt;
&lt;/span&gt;Masz&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;rodzić&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;prać&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;A&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;poszczę&lt;span class="w"&gt; &lt;/span&gt;bo&lt;span class="w"&gt; &lt;/span&gt;piątek&lt;span class="w"&gt;
&lt;/span&gt;Więc&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;obiad&lt;span class="w"&gt; &lt;/span&gt;mam&lt;span class="w"&gt; &lt;/span&gt;pstrąga&lt;span class="w"&gt;
&lt;/span&gt;I&lt;span class="w"&gt; &lt;/span&gt;zemszczę&lt;span class="w"&gt; &lt;/span&gt;się&lt;span class="w"&gt; &lt;/span&gt;pomszczę&lt;span class="w"&gt;
&lt;/span&gt;Niesprawiedliwe&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;idiota&lt;span class="w"&gt;
&lt;/span&gt;Więc&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;poszczę&lt;span class="w"&gt; &lt;/span&gt;bo&lt;span class="w"&gt; &lt;/span&gt;piątek&lt;span class="w"&gt;
&lt;/span&gt;Na&lt;span class="w"&gt; &lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;straży&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;przy&lt;span class="w"&gt; &lt;/span&gt;wrotach&lt;span class="w"&gt;
&lt;/span&gt;Piotrek&lt;span class="w"&gt; &lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;wpuść&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;środka&lt;span class="w"&gt;
&lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;weź&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;niebo&lt;span class="w"&gt; &lt;/span&gt;pokaż&lt;span class="w"&gt;
&lt;/span&gt;Rzucę&lt;span class="w"&gt; &lt;/span&gt;kamieniem&lt;span class="w"&gt; &lt;/span&gt;prosto&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;Twoją&lt;span class="w"&gt; &lt;/span&gt;twarz&lt;span class="w"&gt;
&lt;/span&gt;Nic&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;wiesz&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;Ciebie&lt;span class="w"&gt; &lt;/span&gt;znam&lt;span class="w"&gt;
&lt;/span&gt;W&lt;span class="w"&gt; &lt;/span&gt;niebieskim&lt;span class="w"&gt; &lt;/span&gt;niebie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;otworzą&lt;span class="w"&gt; &lt;/span&gt;bram&lt;span class="w"&gt;
&lt;/span&gt;Bóg&lt;span class="w"&gt; &lt;/span&gt;da&lt;span class="w"&gt; &lt;/span&gt;zbawienie&lt;span class="w"&gt; &lt;/span&gt;ale&lt;span class="w"&gt; &lt;/span&gt;tylko&lt;span class="w"&gt; &lt;/span&gt;nam&lt;span class="w"&gt;
&lt;/span&gt;Rzucę&lt;span class="w"&gt; &lt;/span&gt;kamieniem&lt;span class="w"&gt; &lt;/span&gt;prosto&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;Twoją&lt;span class="w"&gt; &lt;/span&gt;twarz&lt;span class="w"&gt;
&lt;/span&gt;Nic&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;wiesz&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;Ciebie&lt;span class="w"&gt; &lt;/span&gt;znam&lt;span class="w"&gt;
&lt;/span&gt;W&lt;span class="w"&gt; &lt;/span&gt;niebieskim&lt;span class="w"&gt; &lt;/span&gt;niebie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;otworzą&lt;span class="w"&gt; &lt;/span&gt;bram&lt;span class="w"&gt;
&lt;/span&gt;Bóg&lt;span class="w"&gt; &lt;/span&gt;da&lt;span class="w"&gt; &lt;/span&gt;zbawienie&lt;span class="w"&gt; &lt;/span&gt;ale&lt;span class="w"&gt; &lt;/span&gt;tylko&lt;span class="w"&gt; &lt;/span&gt;nam&lt;span class="w"&gt;
&lt;/span&gt;Post
&lt;/pre&gt;
&lt;p&gt;Początkowe trzy z[a]wrotki, rozdzielone zgrabnym kontrapunktem, to panorama. Jej zadaniem jest umiejscowienie sedna, które zostanie gdzieś (w pełnym tekście) i/lub kiedyś (w czasie wyśpiewu) wyrażone oraz ma wszelkie cechy primingu (czyt. prajmingu). Podsiadło czyta dużo internetów, jak widać. Jadę dalej bo tu, to albo każdy wie albo nie ma o czym pisać, a panorama stanie się zrozumiała w kontraście do:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
A&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;poszczę&lt;span class="w"&gt; &lt;/span&gt;bo&lt;span class="w"&gt; &lt;/span&gt;piątek&lt;span class="w"&gt;
&lt;/span&gt;Więc&lt;span class="w"&gt; &lt;/span&gt;rybę&lt;span class="w"&gt; &lt;/span&gt;mam&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;obiad&lt;span class="w"&gt;
&lt;/span&gt;I&lt;span class="w"&gt; &lt;/span&gt;zemszczę&lt;span class="w"&gt; &lt;/span&gt;się&lt;span class="w"&gt; &lt;/span&gt;pomszczę&lt;span class="w"&gt;
&lt;/span&gt;Niesprawiedliwe&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;idiota&lt;span class="w"&gt;
&lt;/span&gt;Więc&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;poszczę&lt;span class="w"&gt; &lt;/span&gt;bo&lt;span class="w"&gt; &lt;/span&gt;piątek&lt;span class="w"&gt;
&lt;/span&gt;Na&lt;span class="w"&gt; &lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;s&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;straży&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;przy&lt;span class="w"&gt; &lt;/span&gt;wrotach&lt;span class="w"&gt;
&lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;weź&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;wpuszczaj&lt;span class="w"&gt; &lt;/span&gt;ich&lt;span class="w"&gt; &lt;/span&gt;Piotrek&lt;span class="w"&gt;
&lt;/span&gt;To&lt;span class="w"&gt; &lt;/span&gt;sama&lt;span class="w"&gt; &lt;/span&gt;jest&lt;span class="w"&gt; &lt;/span&gt;hołota
&lt;/pre&gt;
&lt;p&gt;Część pierwsza sedna się pojawia. Podsiadło Dawid zwraca uwagę, że podmiot liryczny jest poirytowany sytuacją, w której musi omijać mięso, w związku z czym, za pomocą znajomości (tu każdy rozumie, że to przecież śmieszne), u św. Piotra nie wpuści tych, którzy nie przejdą chrześcijańskiej walidacji. Co do znajomości (to jest śmieszne) rację ma, natomiast co do nie przejścia walidacji rację też ma!&lt;/p&gt;
&lt;p&gt;Teraz na chwilę należy sobie przypomnieć co było w panoramie i przez kontrast pojąć, że taka postawa poszczącego nie jest dobra. I tu Podsiadło Dawid ma, jak najbardziej, rację.&lt;/p&gt;
&lt;p&gt;Lecimy ze zwrotkami ostatnimi bo już druga część sedna przestępuje z niecierpliwością z nogi na nogę.&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
Nie&lt;span class="w"&gt; &lt;/span&gt;będzie&lt;span class="w"&gt; &lt;/span&gt;żaden&lt;span class="w"&gt; &lt;/span&gt;Niemiec&lt;span class="w"&gt;
&lt;/span&gt;Czy&lt;span class="w"&gt; &lt;/span&gt;inny&lt;span class="w"&gt; &lt;/span&gt;cudzoziemiec&lt;span class="w"&gt;
&lt;/span&gt;Co&lt;span class="w"&gt; &lt;/span&gt;dzień&lt;span class="w"&gt; &lt;/span&gt;spluwał&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;twarz&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Zabierz&lt;span class="w"&gt; &lt;/span&gt;te&lt;span class="w"&gt; &lt;/span&gt;Pottery&lt;span class="w"&gt;
&lt;/span&gt;Te&lt;span class="w"&gt; &lt;/span&gt;tęczowe&lt;span class="w"&gt; &lt;/span&gt;rowery&lt;span class="w"&gt;
&lt;/span&gt;Weź&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;wszystko&lt;span class="w"&gt; &lt;/span&gt;spal&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Zaczynam&lt;span class="w"&gt; &lt;/span&gt;dziś&lt;span class="w"&gt; &lt;/span&gt;odwierty&lt;span class="w"&gt;
&lt;/span&gt;Bo&lt;span class="w"&gt; &lt;/span&gt;węgiel&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;diamenty&lt;span class="w"&gt;
&lt;/span&gt;Zimą&lt;span class="w"&gt; &lt;/span&gt;będzie&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt; &lt;/span&gt;grzał&lt;span class="w"&gt;
&lt;/span&gt;Post&lt;span class="w"&gt;
&lt;/span&gt;Kobieto&lt;span class="w"&gt; &lt;/span&gt;weź&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;pyskuj&lt;span class="w"&gt;
&lt;/span&gt;Na&lt;span class="w"&gt; &lt;/span&gt;moim&lt;span class="w"&gt; &lt;/span&gt;świecie&lt;span class="w"&gt; &lt;/span&gt;dysku&lt;span class="w"&gt;
&lt;/span&gt;Masz&lt;span class="w"&gt; &lt;/span&gt;mi&lt;span class="w"&gt; &lt;/span&gt;rodzić&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;prać&lt;span class="w"&gt;
&lt;/span&gt;Post
&lt;/pre&gt;
&lt;p&gt;Piosenkarz z wąsem sięga GŁĘBIEJ niż internety, prezentując GŁĘBOKĄ znajomość:&lt;/p&gt;
&lt;ol class="arabic simple" start="0"&gt;
&lt;li&gt;idiomu kulturowego oraz historycznego (z[a]wrotka nr 4),&lt;/li&gt;
&lt;li&gt;współczesnych dylematów popularnej literatury młodzieżowej osadzonych w kontekście magiczno-religijnym oraz [s]tarcia cnót o pedały (z[a]wrotka nr 5),&lt;/li&gt;
&lt;/ol&gt;
&lt;ol class="arabic simple" start="10"&gt;
&lt;li&gt;zielonych [ś]w[i[ątków ekologicznych (nr 6),&lt;/li&gt;
&lt;li&gt;incelo-kuców w trad-stadzie.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Wyżej opisana część służy czytelnikowi/słuchaczowi do zrozumienia w czym się pomylił, jeśli ma rybę w piątek na talerzu. W tej części Podsiadło Dawidowi racji odmawiam i nie będę udowadniał bo on też nie udowadnia. Jemu się nie chciało, to mi też!&lt;/p&gt;
&lt;p&gt;Dobra, na szczęście ostatnia czyli druga część sedna nadeszła, którego w calości nie cytuję bo symbol ryby już był w cz. pierwszej:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
Rzucę&lt;span class="w"&gt; &lt;/span&gt;kamieniem&lt;span class="w"&gt; &lt;/span&gt;prosto&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;Twoją&lt;span class="w"&gt; &lt;/span&gt;twarz&lt;span class="w"&gt;
&lt;/span&gt;Nic&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;wiesz&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;Ciebie&lt;span class="w"&gt; &lt;/span&gt;znam&lt;span class="w"&gt;
&lt;/span&gt;W&lt;span class="w"&gt; &lt;/span&gt;niebieskim&lt;span class="w"&gt; &lt;/span&gt;niebie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;otworzą&lt;span class="w"&gt; &lt;/span&gt;bram&lt;span class="w"&gt;
&lt;/span&gt;Bóg&lt;span class="w"&gt; &lt;/span&gt;da&lt;span class="w"&gt; &lt;/span&gt;zbawienie&lt;span class="w"&gt; &lt;/span&gt;ale&lt;span class="w"&gt; &lt;/span&gt;tylko&lt;span class="w"&gt; &lt;/span&gt;nam&lt;span class="w"&gt;
&lt;/span&gt;Rzucę&lt;span class="w"&gt; &lt;/span&gt;kamieniem&lt;span class="w"&gt; &lt;/span&gt;prosto&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;Twoją&lt;span class="w"&gt; &lt;/span&gt;twarz&lt;span class="w"&gt;
&lt;/span&gt;Nic&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;mnie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;wiesz&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;ja&lt;span class="w"&gt; &lt;/span&gt;Ciebie&lt;span class="w"&gt; &lt;/span&gt;znam&lt;span class="w"&gt;
&lt;/span&gt;W&lt;span class="w"&gt; &lt;/span&gt;niebieskim&lt;span class="w"&gt; &lt;/span&gt;niebie&lt;span class="w"&gt; &lt;/span&gt;nie&lt;span class="w"&gt; &lt;/span&gt;otworzą&lt;span class="w"&gt; &lt;/span&gt;bram&lt;span class="w"&gt;
&lt;/span&gt;Bóg&lt;span class="w"&gt; &lt;/span&gt;da&lt;span class="w"&gt; &lt;/span&gt;zbawienie&lt;span class="w"&gt; &lt;/span&gt;ale&lt;span class="w"&gt; &lt;/span&gt;tylko&lt;span class="w"&gt; &lt;/span&gt;nam
&lt;/pre&gt;
&lt;p&gt;Z kamieniem to chyba każdy wie, nie? Opuszczam, bo Podsiadło Dawid ma rację i cytat jest bardzo adekwatny oraz udany. Należy go często powtarzać. Sobie, panie Podsiadło. Sobie.&lt;/p&gt;
&lt;p&gt;I na koniec najważniejsze słowa i jak najbardziej prawdziwe, aż powtórzę:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
Bóg&lt;span class="w"&gt; &lt;/span&gt;da&lt;span class="w"&gt; &lt;/span&gt;zbawienie&lt;span class="w"&gt; &lt;/span&gt;ale&lt;span class="w"&gt; &lt;/span&gt;tylko&lt;span class="w"&gt; &lt;/span&gt;nam
&lt;/pre&gt;
&lt;p&gt;Bo właśnie o to chodzi!!! Tylko nam. Nikt nie obiecywał inkluzji Dawidku. Wręcz przeciwnie!&lt;/p&gt;
&lt;p&gt;Melodia do pupy ale słowa w sedno. Pół brawa.&lt;/p&gt;
</content><category term="Shitz"></category><category term="shitz"></category></entry><entry><title>Zagłodzić AI</title><link href="https://scyzoryk.fubar.pl/zaglodzic-ai.html" rel="alternate"></link><published>2022-10-20T16:00:00+02:00</published><updated>2022-10-20T16:00:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-10-20:/zaglodzic-ai.html</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Bardzo możliwe, że mój pomysł jest spóźniony ale kto wie?&lt;/div&gt;
&lt;div class="line"&gt;Moglibyśmy kolektywnie spróbować zagłodzić AI, po prostu przestając publikować w Internecie. Modele nie miałyby nic do spożywania, a kanibalizm i chów wsobny kończą się, albo brakiem żarcia, albo dewiacjami.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Chodowałyby się modele sprawnie odróżniające pieska od kotka albo konwersujące na …&lt;/p&gt;</summary><content type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Bardzo możliwe, że mój pomysł jest spóźniony ale kto wie?&lt;/div&gt;
&lt;div class="line"&gt;Moglibyśmy kolektywnie spróbować zagłodzić AI, po prostu przestając publikować w Internecie. Modele nie miałyby nic do spożywania, a kanibalizm i chów wsobny kończą się, albo brakiem żarcia, albo dewiacjami.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Chodowałyby się modele sprawnie odróżniające pieska od kotka albo konwersujące na temat równie złożonych problemów jak np. czy posłanka to leżanka lub czy brwi należy smarować od oka ku włosom czy wręcz odwrotnie.&lt;/p&gt;
&lt;p&gt;Wielu książek wciąż nie przepisano na bity więc pewną nadzieję mam.&lt;/p&gt;
&lt;div class="section" id="glodzimy"&gt;
&lt;h2&gt;Głodzimy?&lt;/h2&gt;
&lt;/div&gt;
</content><category term="AI"></category><category term="ai"></category><category term="systemy"></category><category term="bezpieczeństwo"></category></entry><entry><title>Polska Poczta jest jak Polski rząd</title><link href="https://scyzoryk.fubar.pl/polska-poczta-jest-jak-polski-rzad.html" rel="alternate"></link><published>2022-09-21T08:20:00+02:00</published><updated>2022-09-21T08:20:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-09-21:/polska-poczta-jest-jak-polski-rzad.html</id><summary type="html">&lt;p&gt;Od 30 lat, mimo dyszącej nad głową konkurencji, czas oczekiwania na przesyłkę z Poczty Polskiej niewiele się zmienił. Zupełnie jak w polityce, od 30 lat te same, zakłamane niestety, twarze. I paradygmat działania podobny: mamy was w dupie!&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/09/przesylka-w-drodze.png"&gt;&lt;img alt="image1" class="wp-image-1678" src="/uploads/2022/09/przesylka-w-drodze.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Jest 21 września, środa, 4 dni w drodze. Nie liczę niedzieli ale …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Od 30 lat, mimo dyszącej nad głową konkurencji, czas oczekiwania na przesyłkę z Poczty Polskiej niewiele się zmienił. Zupełnie jak w polityce, od 30 lat te same, zakłamane niestety, twarze. I paradygmat działania podobny: mamy was w dupie!&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/09/przesylka-w-drodze.png"&gt;&lt;img alt="image1" class="wp-image-1678" src="/uploads/2022/09/przesylka-w-drodze.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Jest 21 września, środa, 4 dni w drodze. Nie liczę niedzieli ale sobotę dodaję bo o tej samej godzinie, tego samego dnia, zamówiłem inne rzeczy i cieszę się nimi od soboty, 17 września, bo miałem je w paczkomacie na drugi dzień! Ok, różnica może być w odległości ale na powyższym obrazku widać, że przesyłka nie dotarła do mojego miasta bo nie została zarejestrowana.&lt;/p&gt;
</content><category term="shitz"></category><category term="systemy"></category><category term="komunikacja"></category><category term="bezpieczeństwo"></category></entry><entry><title>W Onecie pojawili się "dziennikarze"</title><link href="https://scyzoryk.fubar.pl/w-onecie-pojawili-sie-dziennikarze.html" rel="alternate"></link><published>2022-09-14T16:51:00+02:00</published><updated>2022-09-14T16:51:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-09-14:/w-onecie-pojawili-sie-dziennikarze.html</id><summary type="html">&lt;p&gt;Kto takich debili ustanowił redaktorami i kto ustanowił debili przełożonymi redaktorów? Mam na myśli debili w sensie medycznym czyli ludzi ze słabym upośledzeniem umysłowym. Przecież nie może być inaczej, tylko upośledzony człowiek po (mam nadzieję) szkole dziennikarstwa może nadal walić takie błędy. Uczyli go przez 4 lata ale nie udało …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kto takich debili ustanowił redaktorami i kto ustanowił debili przełożonymi redaktorów? Mam na myśli debili w sensie medycznym czyli ludzi ze słabym upośledzeniem umysłowym. Przecież nie może być inaczej, tylko upośledzony człowiek po (mam nadzieję) szkole dziennikarstwa może nadal walić takie błędy. Uczyli go przez 4 lata ale nie udało się ze względu na upośledzenie. Tylko jaki poziom umysłowy prezentuje jego przełożony? Zacząłem się bać, że to może zaczynać się wyżej! Boże chroń nas jeśli zaczyna się na uniwersytecie!!!&lt;/p&gt;
</content><category term="shitz"></category><category term="shitz"></category><category term="onet"></category><category term="debile"></category></entry><entry><title>DKIM for relayed domain (rspamd)</title><link href="https://scyzoryk.fubar.pl/dkim-for-relayed-domain-rspamd.html" rel="alternate"></link><published>2022-06-23T17:19:00+02:00</published><updated>2022-06-23T17:19:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-06-23:/dkim-for-relayed-domain-rspamd.html</id><summary type="html">&lt;p&gt;If you need to send e-mail from one domain using not default MX server with all header info correctly rewritten this is guide for you.&lt;/p&gt;
&lt;p&gt;Real world scenario:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;there is MX server for domain dupa.com that you use for normal delivery for users from dupa.com,&lt;/li&gt;
&lt;li&gt;there is also …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;If you need to send e-mail from one domain using not default MX server with all header info correctly rewritten this is guide for you.&lt;/p&gt;
&lt;p&gt;Real world scenario:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;there is MX server for domain dupa.com that you use for normal delivery for users from dupa.com,&lt;/li&gt;
&lt;li&gt;there is also &lt;a class="reference external" href="https://www.phplist.org/"&gt;phpList&lt;/a&gt; service on the very same server that you want to use for massmailing but you want your emails to look like sent from domains: &lt;tt class="docutils literal"&gt;kurka.pl&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;wodna.org&lt;/tt&gt;, with all &lt;strong&gt;SPF&lt;/strong&gt;, &lt;strong&gt;DKIM&lt;/strong&gt; things magically written in headers,&lt;/li&gt;
&lt;li&gt;you are able to edit DNS records and change configuration of &lt;strong&gt;Postfix&lt;/strong&gt; and &lt;strong&gt;rspamd&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="quick-solution-is-like-that"&gt;
&lt;h2&gt;Quick solution is like that:&lt;/h2&gt;
&lt;div class="section" id="postfix"&gt;
&lt;h3&gt;Postfix&lt;/h3&gt;
&lt;p&gt;The two emails you need to be used in &lt;strong&gt;phpList&lt;/strong&gt; configuration are:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
zdzichu@kurka.pl&lt;span class="w"&gt;
&lt;/span&gt;stefan@wodna.org
&lt;/pre&gt;
&lt;p&gt;Add local emails account to your &lt;strong&gt;Postfix&lt;/strong&gt;, I will not cover it here because there are many methods to do it. For this solution I will choose:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
kurka@dupa.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;used&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zdzichu@kurka.pl&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;wodka@dupa.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;used&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;stefan@wodna.org&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Check if you really can authorize and send emails, just to not mess with it when something will not work later.&lt;/p&gt;
&lt;p&gt;In a &lt;strong&gt;Postfix&lt;/strong&gt; configuration (&lt;tt class="docutils literal"&gt;/etc/postfix/main.cf&lt;/tt&gt;) allow your server to be relay for both &lt;tt class="docutils literal"&gt;kurka.pl&lt;/tt&gt;and &lt;tt class="docutils literal"&gt;wodna.org&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
relay_domains = kurka.pl, wodna.org
&lt;/pre&gt;
&lt;p&gt;Then add following line which will instruct &lt;strong&gt;Postfix&lt;/strong&gt; how to map particular local emails to emails from both external domains:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
smtp_generic_maps = hash:/etc/postfix/rewrite_phplists
&lt;/pre&gt;
&lt;p&gt;Content of &lt;tt class="docutils literal"&gt;/etc/postfix/rewrite_phplist&lt;/tt&gt; is:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
kurka@dupa.com zdzichu@kurka.pl
wodka@dupa.com stefan@wodna.org
&lt;/pre&gt;
&lt;p&gt;Do you see how they maps togheter? OK, now make hash table from this file:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cd /etc/postfix
postmap rewrite_phplist
&lt;/pre&gt;
&lt;p&gt;Do &lt;tt class="docutils literal"&gt;ls&lt;/tt&gt; to check if &lt;strong&gt;rewrite_phplist.db&lt;/strong&gt; file were created.&lt;/p&gt;
&lt;p&gt;If so, reload &lt;strong&gt;Postfix&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl reload postfix
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="spf"&gt;
&lt;h3&gt;SPF&lt;/h3&gt;
&lt;p&gt;Add IP address of &lt;tt class="docutils literal"&gt;dupa.com&lt;/tt&gt; to your SPF record in your DNS zone form &lt;tt class="docutils literal"&gt;kurka.pl&lt;/tt&gt;, it should be something like:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
"v=spf1 a mx ip4:yyy.yyy.yyy.yyy ip4:xxx.xxx.xxx.xxx  ~all"
&lt;/pre&gt;
&lt;p&gt;where yyy.yyy.yyy.yyy is IP of &lt;tt class="docutils literal"&gt;kurka.pl&lt;/tt&gt;, and xxx.xxx.xxx.xxx of &lt;tt class="docutils literal"&gt;dupa.com&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Then same for &lt;tt class="docutils literal"&gt;wodna.org&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
"v=spf1 a mx ip4:zzz.zzz.zzz.zzz ip4:xxx.xxx.xxx.xxx ~all"
&lt;/pre&gt;
&lt;p&gt;where zzz.zzz.zzz.zzz is IP of &lt;tt class="docutils literal"&gt;wodna.pl&lt;/tt&gt;, and xxx.xxx.xxx.xxx IP is for... gues what? Of course, also &lt;tt class="docutils literal"&gt;dupa.com&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="rspamd"&gt;
&lt;h3&gt;RSPAMD&lt;/h3&gt;
&lt;p&gt;Now, we need DKIM keys for both extrenal domains. I presume that you already have DKIM records in your DNS zone. I will not cover it here, look for it in Internet or ask you local guru.&lt;/p&gt;
&lt;p&gt;Copy both DKIM keys on &lt;tt class="docutils literal"&gt;dupa.com&lt;/tt&gt; server into &lt;tt class="docutils literal"&gt;/var/lib/rspamd/dkim/&lt;/tt&gt; folder. Key for &lt;tt class="docutils literal"&gt;dupa.com&lt;/tt&gt; should already be there as &lt;tt class="docutils literal"&gt;dupa.key&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Let's say keyfile for &lt;tt class="docutils literal"&gt;kurka.pl&lt;/tt&gt; is named: &lt;strong&gt;kurka.key&lt;/strong&gt; and keyfile for &lt;tt class="docutils literal"&gt;wodna.org&lt;/tt&gt; is named: &lt;strong&gt;wodna.key&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Now edit file&lt;tt class="docutils literal"&gt;/etc/rspamd/local.d/dkim_signing.conf&lt;/tt&gt; and put following directives in it:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
### Enable DKIM signing for alias sender addresses
allow_username_mismatch = true;

# If true, envelope/header domain mismatch is ignored
# it will allow to sign emails from external domains
allow_hdrfrom_mismatch = true;

# This allows to sign also local emails
sign_local = true;

# This maps domains with corresponding keys
domain {
        # DUPA.COM (we want sign original emails)
        dupa.com {
        # Private key path
        path = "/var/lib/rspamd/dkim/dupa.key";
        selector = "dupa2022";
        }
        # KURKA.pl
        kurka.pl {
        # Private key path
        path = "/var/lib/rspamd/dkim/kurka.key";
        selector = "kurka2022";
        }
        # WODNA.ORG
        wodna.org {
        # Private key path
        path = "/var/lib/rspamd/dkim/wodna.key";
        selector = "wodna2022";
        }
}
&lt;/pre&gt;
&lt;p&gt;Save it and copy file &lt;tt class="docutils literal"&gt;/etc/rspamd/local.d/dkim_signing.conf&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;/etc/rspamd/local.d/arc.conf&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cd /etc/rspamd/local.d/
cp dkim_signing.conf arc.conf
&lt;/pre&gt;
&lt;p&gt;Now, restart &lt;strong&gt;rspamd&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl restart rspamd
&lt;/pre&gt;
&lt;p&gt;Now, it should work.&lt;/p&gt;
&lt;p&gt;You can check it with following tool: &lt;a class="reference external" href="https://www.mail-tester.com/"&gt;https://www.mail-tester.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In case something is wrong you can check &lt;strong&gt;rspamd&lt;/strong&gt; log for DKIM errors, add following lines to &lt;tt class="docutils literal"&gt;/etc/rspamd/local.d/logging.inc&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
type = "file";
filename = "/var/log/rspamd/rspamd.log";
level = "error";
debug_modules = ["dkim_signing"];
&lt;/pre&gt;
&lt;p&gt;Then look what happens in log file:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
tail -f /var/log/rspamd/rspamd.log
&lt;/pre&gt;
&lt;p&gt;Remeber to comment out last line when you will finish debbuging.&lt;/p&gt;
&lt;p&gt;Thanks for listening, don't comment (no comments), you can share it wherever you want.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Administracja"></category><category term="mail"></category><category term="postfix"></category></entry><entry><title>Stop logging to deal with /var/log</title><link href="https://scyzoryk.fubar.pl/stop-logging-to-deal-with-var-log.html" rel="alternate"></link><published>2022-06-10T10:10:00+02:00</published><updated>2022-06-10T10:10:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-06-10:/stop-logging-to-deal-with-var-log.html</id><summary type="html">&lt;p&gt;I have /var/log mounted as separate partition, so trying to umount it gets to:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
root@mail:~# umount /var/log
umount: /var/log: target is busy.
&lt;/pre&gt;
&lt;p&gt;Let's look what is blocking it:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
lsof | grep 'var/log'
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
systemd-j 364 root mem REG 8,18 8388608 524326 /var/log/journal/d59b94e79c8c4d78baaa487f78c7f5b1/user-1000 …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;I have /var/log mounted as separate partition, so trying to umount it gets to:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
root@mail:~# umount /var/log
umount: /var/log: target is busy.
&lt;/pre&gt;
&lt;p&gt;Let's look what is blocking it:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
lsof | grep 'var/log'
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
systemd-j 364 root mem REG 8,18 8388608 524326 /var/log/journal/d59b94e79c8c4d78baaa487f78c7f5b1/user-1000@666512ad46e3412bb055fb811107893a-000000000062c409-0005e11333729c20.journal
php-fpm7. 696 root 4w REG 8,18 1456 64 /var/log/php7.4-fpm.log
unattende 821 998 gmain root 3w REG 8,18 113 524316 /var/log/unattended-upgrades/unattended-upgrades-shutdown.log
nginx 1016 root 2w REG 8,18 16384 393237 /var/log/nginx/error.log
nginx 1019 www-data 7w REG 8,18 4096 393267 /var/log/nginx/phplist-error.log
rspamd 1560 _rspamd 6w REG 8,18 7009 393282 /var/log/rspamd/rspamd.log
&lt;/pre&gt;
&lt;p&gt;There are more of them, so I just removed some lines.&lt;/p&gt;
&lt;p&gt;Services like ngins, rspamd, php-fpm are easy to stop, just do like following:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl stop nginx.service
&lt;/pre&gt;
&lt;p&gt;But what about systemd journal itself and kernel loggin? Do this:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl stop logrotate.timer
systemctl stop unattended-upgrades.service
systemctl stop systemd-journald.service
systemctl stop syslog.socket
&lt;/pre&gt;
&lt;p&gt;and they are gone!&lt;/p&gt;
</content><category term="Linux"></category><category term="systemy"></category><category term="bezpieczeństwo"></category><category term="administracja"></category></entry><entry><title>Free Virtual Data Room - Pydio/Cells</title><link href="https://scyzoryk.fubar.pl/free_virtual_data_room_pydio_cells.html" rel="alternate"></link><published>2022-03-31T12:50:00+02:00</published><updated>2022-03-31T12:50:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-03-31:/free_virtual_data_room_pydio_cells.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Few years ago I built a VDR for a hotel developer. It was a simple repository for documents, with simple permissions: one administrator and many users with read option. Later it got a bit more complex, but not too much so. The repository …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Few years ago I built a VDR for a hotel developer. It was a simple repository for documents, with simple permissions: one administrator and many users with read option. Later it got a bit more complex, but not too much so. The repository was operated by &lt;strong&gt;vsftpd&lt;/strong&gt; and the sharing was made possible by Apache. This is still working today. The main disadvantage of this system is the susceptibility to human error - you have to set up access groups and users very carefully.&lt;/p&gt;
&lt;p&gt;Recently someone who knew my old VDR asked if it's easy to do because he wanted to have his own. I said yes and no, and that the configuration was messed up. And I decided to find something better.&lt;/p&gt;
&lt;p&gt;Once I did something for a company from Switzerland which had bought hosting, and one of the services available from one click was &lt;strong&gt;Pydio&lt;/strong&gt;. Just a simple VDR.&lt;/p&gt;
&lt;p&gt;Today it's a really mature product and it has a container version, so I decided to check it out.&lt;/p&gt;
&lt;p&gt;I insisted that I will use &lt;strong&gt;Portainer&lt;/strong&gt; because it's very convenient when it comes to container handling.&lt;/p&gt;
&lt;p&gt;I put &lt;strong&gt;Portainer&lt;/strong&gt; on a virtual machine with IP: 192.168.1.8. I had Ubuntu 21.10 on it so installing &lt;strong&gt;Portainer&lt;/strong&gt; comes down to:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;volume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;portainer_data
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;:8000&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9443&lt;/span&gt;:9443&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;portainer&lt;span class="w"&gt; &lt;/span&gt;--restart&lt;span class="o"&gt;=&lt;/span&gt;always&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;portainer_data:/data&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;portainer/portainer-ce:2.11.1
&lt;/pre&gt;
&lt;p&gt;At this step I don't care about SSL certificate and ports and after a few seconds I have the GUI of the &lt;strong&gt;Portainer&lt;/strong&gt; (remember my VM has IP 192.168.1.8):&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://192.168.1.8:9443"&gt;https://192.168.1.8:9443&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Nex step is to install the database for &lt;strong&gt;Pydio&lt;/strong&gt;, it will be &lt;strong&gt;MariaDB&lt;/strong&gt; containe from &lt;em&gt;linuxserver/mariadb&lt;/em&gt;.&lt;/div&gt;
&lt;div class="line"&gt;(&lt;a class="reference external" href="https://hub.docker.com/r/linuxserver/mariadb"&gt;https://hub.docker.com/r/linuxserver/mariadb&lt;/a&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In the &lt;strong&gt;Portainer&lt;/strong&gt; I choose &lt;tt class="docutils literal"&gt;Volumes &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Add Volume&lt;/tt&gt;, I name the volume for example "baza".&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/baza.png"&gt;&lt;img alt="image1" class="wp-image-1572" src="/uploads/2022/03/baza.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Now I create a container: &lt;tt class="docutils literal"&gt;Containers &lt;span class="pre"&gt;-&amp;gt;&lt;/span&gt; Add Container&lt;/tt&gt; and fill in the fields:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/mariadb-docker.png"&gt;&lt;img alt="image2" class="wp-image-1571" src="/uploads/2022/03/mariadb-docker.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;On the Volumes tab I choose "map additional volume" and fill in the fields:&lt;/div&gt;
&lt;div class="line"&gt;container /config&lt;/div&gt;
&lt;div class="line"&gt;volume base - local&lt;/div&gt;
&lt;/div&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/baza2.png"&gt;&lt;img alt="image3" class="wp-image-1573" src="/uploads/2022/03/baza2.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;On the Env tab I choose "Add an environment variable" and fill in the fields:&lt;/div&gt;
&lt;div class="line"&gt;PGID 1000&lt;/div&gt;
&lt;div class="line"&gt;PUID 1000&lt;/div&gt;
&lt;div class="line"&gt;MYSQL_ROOT_PASSWORD my_password_to_mysql&lt;/div&gt;
&lt;div class="line"&gt;TZ Europe/Warsaw&lt;/div&gt;
&lt;/div&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/baza_env.png"&gt;&lt;img alt="image4" class="wp-image-1574" src="/uploads/2022/03/baza_env.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;At the end I click "Deploy the container".&lt;/p&gt;
&lt;p&gt;When the image has finished downloading and the container starts running in the Portainer Containers tab you can see what IP address our database has. In my case it is for example 172.17.0.4, and MariaDB is running on default port 3306.&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/container_list01.png"&gt;&lt;img alt="image5" class="wp-image-1575" src="/uploads/2022/03/container_list01.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Now it's time for Pydio/Cells.&lt;/div&gt;
&lt;div class="line"&gt;As with the database I start with the Volume. Why? Because I want the data to be independent of the containers, this will be useful when servicing them, such as updating.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I choose Volumes -&amp;gt; Add Volume, I name the volume for example "pydio-vdr".&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/pydio-vdr-volume.png"&gt;&lt;img alt="image6" class="wp-image-1576" src="/uploads/2022/03/pydio-vdr-volume.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Now I create a container:&lt;/div&gt;
&lt;div class="line"&gt;Name pydio&lt;/div&gt;
&lt;div class="line"&gt;Image pydio/cells:latest&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;A small difference with MariaDB, I set the port mapping:&lt;/div&gt;
&lt;div class="line"&gt;external (on host) in the container&lt;/div&gt;
&lt;div class="line"&gt;8443 8080&lt;/div&gt;
&lt;/div&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/pydio-containe.png"&gt;&lt;img alt="image7" class="wp-image-1577" src="/uploads/2022/03/pydio-containe.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;I also map the created volume "vdr".&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/pydio-volume-map.png"&gt;&lt;img alt="image8" class="wp-image-1578" src="/uploads/2022/03/pydio-volume-map.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Finally I click "Deploy the container" and after a while at: &lt;a class="reference external" href="https://192.168.1.8:8443"&gt;https://192.168.1.8:8443&lt;/a&gt; I have the Pydio installation page. In the appropriate fields I enter the data to connect to the database, that is, as host 172.17.0.4 and the password.&lt;/p&gt;
&lt;p&gt;The installation itself is simple, it's a few fields to fill in and clicking on "Next", so I won't elaborate.&lt;/p&gt;
&lt;p&gt;Here's how the Portainer GUI should look like:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/container_list02.png"&gt;&lt;img alt="image9" class="wp-image-1579" src="/uploads/2022/03/container_list02.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If not for the fact that my Portainer machine is behind a firewall this would be the end of the job. However, I still need to use a reverse proxy to get to the machine through the public address.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;I start by adding an A record to DNS pointing to my firewall.&lt;/div&gt;
&lt;div class="line"&gt;Let's assume that the public address: &lt;strong&gt;vdr.dupa.pl&lt;/strong&gt; points to the firewall. In the firewall itself I have a NAT rule redirecting ports 80 and 443 to the address of the web server (192.168.1.80) where I set up the reverse proxy.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here are the redirect rules in firewall:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/firewall_rules.png"&gt;&lt;img alt="image10" class="wp-image-1580" src="/uploads/2022/03/firewall_rules.png"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Log in to the webserver and set up proxy as follows:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    ServerName vdr.dupa.pl
    Redirect / https://vdr.dupa.pl/
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;:443&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    ServerName vdr.dupa.pl
    AllowEncodedSlashes On
    SSLEngine on
    SSLProxyEngine  On
    ProxyPreserveHost On
    ProxyRequests off
    Loglevel debug
        ProxyPassMatch "/ws/(.*)" wss://192.168.1.8:8443/ws/$1 nocanon
    ProxyPass / https://192.168.1.8:8443/ nocanon
        ProxyPassReverse  / https://192.168.1.8:8443/ nocanon
        ProxyRequests off
    SSLCertificateFile /etc/letsencrypt/live/vdr.dupa.pl/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/vdr.dupa.pl/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        RequestHeader set X-Forwarded-Proto “https”
        RequestHeader set X-Forwarded-Port “443”
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I have the proxy on Apache because that's where Apache is and I'm not going to move everything to nginx now.&lt;/p&gt;
&lt;p&gt;First I generate Let'sEncrypt certificate for vdr.dupa.pl.&lt;/p&gt;
&lt;p&gt;I kill Apache:&lt;/p&gt;
&lt;p&gt;sudo systemct stop apache2&lt;/p&gt;
&lt;p&gt;sudo certbot --certonly --standalone -d vdr.dupa.pl&lt;/p&gt;
&lt;p&gt;In /etc/apache2/sites-available I have the vdr.dupa.pl.conf configuration file:&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;.&lt;/div&gt;
&lt;div class="line"&gt;ServerName vdr.dupa.pl&lt;/div&gt;
&lt;div class="line"&gt;Redirect / &lt;a class="reference external" href="https://vdr.dupa.pl/"&gt;https://vdr.dupa.pl/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ServerName vdr.dupa.pl SSLEngine on SSLProxyEngine On ProxyPreserveHost On ProxyRequests off Loglevel debug ProxyPass / &lt;a class="reference external" href="https://192.168.1.8:8443/"&gt;https://192.168.1.8:8443/&lt;/a&gt; SSLCertificateFile /etc/letsencrypt/live/vdr.dupa.pl/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/vdr.dupa.pl/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf ProxyPassReverse / RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" . .&lt;/p&gt;
&lt;p&gt;sudo a2ensite vdr.dupa.pl.conf&lt;/p&gt;
&lt;p&gt;sudo systemctl start apache2&lt;/p&gt;
&lt;p&gt;I go to &lt;a class="reference external" href="https://vdr.dupa.pl"&gt;https://vdr.dupa.pl&lt;/a&gt; and…&lt;/p&gt;
&lt;p&gt;500 Internal server error&lt;/p&gt;
&lt;p&gt;Oh dear! In the Apache logs you can see what happened, the proxy establishes an https connection with Pydio but the certificate doesn't match, no wonder.&lt;/p&gt;
&lt;p&gt;The easiest way is: generated certificate and key for domain vdr.dupa.pl I copy myself gdz&lt;/p&gt;
</content><category term="Administracja"></category></entry><entry><title>Rozbójnicy z ICM</title><link href="https://scyzoryk.fubar.pl/rozbojnicy-z-icm.html" rel="alternate"></link><published>2022-03-30T14:06:00+02:00</published><updated>2022-03-30T14:06:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-03-30:/rozbojnicy-z-icm.html</id><summary type="html">&lt;p&gt;Gdzieś w początkach lat 2000-nych ICM wyrwał się ze świetną inicjatywą skierowaną do artystów i instytucji związanych ze sztuką. Mianowicie pozwalał na rejestrowanie subdomen w domenie &lt;strong&gt;.art.pl&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Usługa miała być dożywotnia i darmowa (mówi się na to "pro publico bono" czyli dla dobra publicznego).&lt;/p&gt;
&lt;p&gt;Z tego co się orientuję …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Gdzieś w początkach lat 2000-nych ICM wyrwał się ze świetną inicjatywą skierowaną do artystów i instytucji związanych ze sztuką. Mianowicie pozwalał na rejestrowanie subdomen w domenie &lt;strong&gt;.art.pl&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Usługa miała być dożywotnia i darmowa (mówi się na to "pro publico bono" czyli dla dobra publicznego).&lt;/p&gt;
&lt;p&gt;Z tego co się orientuję sporo osób prywatnych oraz instytucji publicznych zarejestrowało sobie domeny w art.pl i przez lat przeszło dwadzieścia używało. Ludzie się przyzwyczaili.&lt;/p&gt;
&lt;p&gt;Aż tu nagle w roku obecnym 2022, ICM przekazało zarządzanie domenami jakiejś firemce z Warszawy. ICM to podmiot utrzymywany z podatków więc przy przekazaniu powinny być zachowane jakieś zasady, ot żeby nie kusiło jakichś złodziei. Jak się to odbyło? A cholera wie ale chyba niezbyt przeźroczyście. Jest dyskusja o tym tu: &lt;a class="reference external" href="https://forum.rootnode.pl/topic/2232-zmiana-operatora-domen-artpl/"&gt;https://forum.rootnode.pl/topic/2232-zmiana-operatora-domen-artpl/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Firemka żąda sobie obecnie ponad 148 złotych za rok, w promocji 80 zł, co w porówaniu za domenę np. w OVH 49,90 zł/rocznie jest szalbierswem.&lt;/p&gt;
&lt;p&gt;Napisałem im, żeby mnie pocałowali w dupę.&lt;/p&gt;
&lt;p&gt;A to co zrobiło ICM ze swoją obietnicą to kawał świństwa bo zachowali się jak bandzior przystawiający pistolet do głowy z tekstem: "płacisz albo strzelam".&lt;/p&gt;
&lt;p&gt;ICM też niech się całuje w dupę.&lt;/p&gt;
</content><category term="Historia komputerów"></category><category term="komunikacja"></category><category term="bezpieczeństwo"></category><category term="systemy"></category></entry><entry><title>Thunderbird jak Mail.app</title><link href="https://scyzoryk.fubar.pl/thunderbird-jak-mail-app.html" rel="alternate"></link><published>2022-03-08T14:17:00+01:00</published><updated>2022-03-08T14:17:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-03-08:/thunderbird-jak-mail-app.html</id><summary type="html">&lt;p&gt;W macOS-ie był (może jest) dobry klient poczty, obsługa poczty na szerokim ekranie to była przyjemność, której zapragnąłem w Thunderbirdzie. I da się.&lt;/p&gt;
&lt;p&gt;W menu (polskim): Widok -&amp;gt; Układ -&amp;gt; Pionowy.&lt;/p&gt;
&lt;p&gt;Ale domyślne czcionki są nieco za duże więc trzeba pogrzebać w edytorze Ustawień czyli "Hamburger menu" -&amp;gt; Preferencje -&amp;gt; Ogólne, scrollem na sam …&lt;/p&gt;</summary><content type="html">&lt;p&gt;W macOS-ie był (może jest) dobry klient poczty, obsługa poczty na szerokim ekranie to była przyjemność, której zapragnąłem w Thunderbirdzie. I da się.&lt;/p&gt;
&lt;p&gt;W menu (polskim): Widok -&amp;gt; Układ -&amp;gt; Pionowy.&lt;/p&gt;
&lt;p&gt;Ale domyślne czcionki są nieco za duże więc trzeba pogrzebać w edytorze Ustawień czyli "Hamburger menu" -&amp;gt; Preferencje -&amp;gt; Ogólne, scrollem na sam dół i odpalamy "Edytor ustawień".&lt;/p&gt;
&lt;p&gt;Wyszukujemy "font.size.systemFontScale" i ustawiamy np. na 70. Restart i ....&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/thunderbird-wide.jpg"&gt;&lt;img alt="image1" class="wp-image-1557" src="/uploads/2022/03/thunderbird-wide.jpg" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/div&gt;
</content><category term="Tips"></category><category term="linux"></category><category term="mail"></category></entry><entry><title>Radio łazienkowe cz.1</title><link href="https://scyzoryk.fubar.pl/radio-lazienkowe-cz-1.html" rel="alternate"></link><published>2022-03-06T22:38:00+01:00</published><updated>2022-03-06T22:38:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-03-06:/radio-lazienkowe-cz-1.html</id><summary type="html">&lt;p&gt;&lt;em&gt;W kontekście tego szaleństwa, które nas otacza od dni 10-ciu, szaleństwem nie mniejszym wydaje się robienie łazienkowego radia. Ale muszę coś robić, żeby nie zwariować od wiadomości pokazujących w jak czarnej dziurze jesteśmy. Mogę tylko dodać: wspierajcie&lt;/em&gt; &lt;a class="reference external" href="https://adarma.pl/"&gt;Fundację Ad Arma&lt;/a&gt; &lt;em&gt;- to są dobrzy i rozsądni ludzie.&lt;/em&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Projekt ten zaczął się …&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;W kontekście tego szaleństwa, które nas otacza od dni 10-ciu, szaleństwem nie mniejszym wydaje się robienie łazienkowego radia. Ale muszę coś robić, żeby nie zwariować od wiadomości pokazujących w jak czarnej dziurze jesteśmy. Mogę tylko dodać: wspierajcie&lt;/em&gt; &lt;a class="reference external" href="https://adarma.pl/"&gt;Fundację Ad Arma&lt;/a&gt; &lt;em&gt;- to są dobrzy i rozsądni ludzie.&lt;/em&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Projekt ten zaczął się już 4 lata temu ale jakoś się nie rozwinął. Były to próby z zupełnie innym, niż obecny, modułem. Radio działało, miało wyświetlacz (od Nokii) potencjometry i wzmacniacz ale sam moduł miał jakąś wadę. Kopałem się z tym koniem tak długo, że skończyła mi się cierpliwość.&lt;/div&gt;
&lt;div class="line"&gt;Resztki wyglądają tak:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/stare_rdio.jpg"&gt;&lt;img alt="image1" class="wp-image-1547" src="/uploads/2022/03/stare_rdio.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Nowy moduł to TEA5767 z gniazdami typu jack dla anteny i słuchawek. Wyjście słuchawkowe wykorzystam jako sygnał do dodatkowego wzmacniacza bo głośnika, wbudowany nie uciągnie.&lt;/p&gt;
&lt;p&gt;Zalążek wygląda tak:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2022/03/nowe_radio.jpg"&gt;&lt;img alt="image2" class="wp-image-1548" src="/uploads/2022/03/nowe_radio.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;W Arduino IDE doinstalowałem bibliotekę o nazwie "Radio", strona biblioteki jest pod tym adresem: &lt;a class="reference external" href="http://www.mathertel.de/Arduino/RadioLibrary.aspx"&gt;http://www.mathertel.de/Arduino/RadioLibrary.aspx&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Używam Arduino UNO ale im bliżej końca tym bardziej będę chciał użyć jakiegoś klona Nano, mam ATmega328 CH340, z tym że boję się czy wystarczy pamięci do sprawnego działania. Ostatnim razem miałem, jak pisałem już wyżej, kłopoty i coś mi się zaczyna przypominać, że jechał już na oparach jeśli chodzi o pamięć.&lt;/p&gt;
&lt;p&gt;Głośnik mam sufitowy, marki Blow, o nast. specyfikacji:&lt;/p&gt;
&lt;div class="float wp-block-table docutils container"&gt;
&lt;table class="docutils"&gt;

&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Średnica&lt;/td&gt;
&lt;td&gt;4 cale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Moc maksymalna&lt;/td&gt;
&lt;td&gt;15 W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Impedancja&lt;/td&gt;
&lt;td&gt;8 Ohm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cewka&lt;/td&gt;
&lt;td&gt;0,75" ASV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Magnes&lt;/td&gt;
&lt;td&gt;60x24x8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Zakres częstotliwości&lt;/td&gt;
&lt;td&gt;104Hz - 15kHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Czułość&lt;/td&gt;
&lt;td&gt;87dB +/- 2dB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Myślę nad wzmacniaczem... moje typy, totalnie na czuja i chyba przesadzone:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://mageek.com.pl/audio-wzmacniacze/458-modul-wzmacniacz-audio-tda2030-18w-koncowka-mocy-18w.html"&gt;https://mageek.com.pl/audio-wzmacniacze/458-modul-wzmacniacz-audio-tda2030-18w-koncowka-mocy-18w.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://mageek.com.pl/audio-wzmacniacze/244-modul-wzmacniacz-audio-pam88610.html"&gt;https://mageek.com.pl/audio-wzmacniacze/244-modul-wzmacniacz-audio-pam88610.html&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Do sterowania mam zamiar użyć panelu dotykowego:&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://www.artronic.eu/pl/p/LCD-RTP-128064A-goldpin4/1043"&gt;https://www.artronic.eu/pl/p/LCD-RTP-128064A-goldpin4/1043&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Wydrukować pod spód wkładkę z narysowanymi przyciskami bo nie znalazłem wodoodpornego panelu.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;A'propos wody to myślę jak zabezpieczyć całość. Ludzie proponują takie specyfiki:&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://www.f4p-products.com/products/4319079-2-x-150ml-bottles-of-magic-gel"&gt;https://www.f4p-products.com/products/4319079-2-x-150ml-bottles-of-magic-gel&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.mgchemicals.com/products/conformal-coating/silicone-conformal-coatings/silicone-modified-conformal-coating/"&gt;https://www.mgchemicals.com/products/conformal-coating/silicone-conformal-coatings/silicone-modified-conformal-coating/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ewentualnie pudełko:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.adafruit.com/product/341"&gt;https://www.adafruit.com/product/341&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Aha, a kod? Zalążek wzięty z przykładu załączonego do blblioteki "Radio":&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
///
/// \file SerialRadio.ino
/// \brief Radio implementation using the Serial communication.
///
/// \author Matthias Hertel, http://www.mathertel.de
/// \copyright Copyright (c) 2014 by Matthias Hertel.\n
/// This work is licensed under a BSD style license.\n
/// See http://www.mathertel.de/Arduino/RadioLibrary.aspx
///
/// \details
/// This is a full function radio implementation that uses a LCD display to show the current station information.\n
/// It can be used with various chips after adjusting the radio object definition.\n
/// Open the Serial console with 57600 baud to see current radio information and change various settings.
///
/// Wiring
/// ------
/// The necessary wiring of the various chips are described in the Testxxx example sketches.
/// The boards have to be connected by using the following connections:
///
/// Arduino port | TEA5767 z portami dla anteny i sluchawek
/// :----------: | :-----------:
/// GND (black)  | GND
/// 3.3V (red)   | -
/// 5V (red)     | VCC
/// A5 (yellow)  | SLC (SLCK)
/// A4 (blue)    | SDA (SDIO)
/// D2           | -
///
/// UWAGA RDS NIE DZIALA!
///
/// More documentation and source code is available
/// at http://www.mathertel.de/Arduino
///
/// History:
/// --------
/// * 05.08.2014 created.
/// * 04.10.2014 working.

#include &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Wire.h&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
#include &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;radio.h&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
#include &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;TEA5767.h&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
#include &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;RDSParser.h&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;


// Define some stations available at your locations here:
// 89.40 MHz as 8940

RADIO_FREQ preset[] = {
  8780, // Wnet
  8840, // Pogoda
  8900, // Maryja
  8980, // Supernova
  9060, // RMF FM
  9200, // Polskie Radio 24
  9240, // Jedynka
  9330, // Eska
  9710, // Kampus
  9770, // Tok FM
  9880, // Trojka
  10110, // Zlote Przeboje
  10150, // ChilliZet
  10370, // Rock Radio
  10680 // Antyradio
};

int    i_sidx = 0;        ///&lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;Start&lt;/span&gt; &lt;span class="na"&gt;at&lt;/span&gt; &lt;span class="na"&gt;Station&lt;/span&gt; &lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="na"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;

&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;The&lt;/span&gt; &lt;span class="na"&gt;radio&lt;/span&gt; &lt;span class="na"&gt;object&lt;/span&gt; &lt;span class="na"&gt;has&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;be&lt;/span&gt; &lt;span class="na"&gt;defined&lt;/span&gt; &lt;span class="na"&gt;by&lt;/span&gt; &lt;span class="na"&gt;using&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt; &lt;span class="na"&gt;corresponding&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;used&lt;/span&gt; &lt;span class="na"&gt;chip&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;by&lt;/span&gt; &lt;span class="na"&gt;uncommenting&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;right&lt;/span&gt; &lt;span class="na"&gt;radio&lt;/span&gt; &lt;span class="na"&gt;object&lt;/span&gt; &lt;span class="na"&gt;definition&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;

&lt;span class="na"&gt;TEA5767&lt;/span&gt;  &lt;span class="na"&gt;radio&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;    &lt;span class="err"&gt;///&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;Create&lt;/span&gt; &lt;span class="na"&gt;an&lt;/span&gt; &lt;span class="na"&gt;instance&lt;/span&gt; &lt;span class="na"&gt;of&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;TEA5767&lt;/span&gt; &lt;span class="na"&gt;chip&lt;/span&gt; &lt;span class="na"&gt;radio&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;


&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;get&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;RDS&lt;/span&gt; &lt;span class="na"&gt;parser&lt;/span&gt;
&lt;span class="na"&gt;RDSParser&lt;/span&gt; &lt;span class="na"&gt;rds&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt;


&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;State&lt;/span&gt; &lt;span class="na"&gt;definition&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="na"&gt;this&lt;/span&gt; &lt;span class="na"&gt;radio&lt;/span&gt; &lt;span class="na"&gt;implementation&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="na"&gt;enum&lt;/span&gt; &lt;span class="na"&gt;RADIO_STATE&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;STATE_PARSECOMMAND&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;///&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;waiting&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;new&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt; &lt;span class="na"&gt;character&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;

  &lt;span class="na"&gt;STATE_PARSEINT&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;     &lt;span class="err"&gt;///&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;waiting&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="na"&gt;digits&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;parameter&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
  &lt;span class="na"&gt;STATE_EXEC&lt;/span&gt;          &lt;span class="err"&gt;///&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;executing&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;};&lt;/span&gt;

&lt;span class="na"&gt;RADIO_STATE&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="err"&gt;///&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;The&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt; &lt;span class="na"&gt;variable&lt;/span&gt; &lt;span class="na"&gt;is&lt;/span&gt; &lt;span class="na"&gt;used&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="na"&gt;parsing&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt; &lt;span class="na"&gt;characters&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;

&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt;



&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;Update&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;Frequency&lt;/span&gt; &lt;span class="na"&gt;on&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;LCD&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="na"&gt;void&lt;/span&gt; &lt;span class="na"&gt;DisplayFrequency&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;RADIO_FREQ&lt;/span&gt; &lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;char&lt;/span&gt; &lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;12&lt;/span&gt;&lt;span class="err"&gt;];&lt;/span&gt;
  &lt;span class="na"&gt;radio&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;formatFrequency&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sizeof&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="err"&gt;));&lt;/span&gt;
  &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;print&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;FREQ:&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt; &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="err"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;DisplayFrequency&lt;/span&gt;&lt;span class="err"&gt;()&lt;/span&gt;


&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;Update&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;ServiceName&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt; &lt;span class="na"&gt;on&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;LCD&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="na"&gt;void&lt;/span&gt; &lt;span class="na"&gt;DisplayServiceName&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;char&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;print&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;RDS:&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
  &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="err"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;DisplayServiceName&lt;/span&gt;&lt;span class="err"&gt;()&lt;/span&gt;


&lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;-&lt;/span&gt;


&lt;span class="na"&gt;void&lt;/span&gt; &lt;span class="na"&gt;RDS_process&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;uint16_t&lt;/span&gt; &lt;span class="na"&gt;block1&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;uint16_t&lt;/span&gt; &lt;span class="na"&gt;block2&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;uint16_t&lt;/span&gt; &lt;span class="na"&gt;block3&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;uint16_t&lt;/span&gt; &lt;span class="na"&gt;block4&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;rds&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processData&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;block1&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;block2&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;block3&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;block4&lt;/span&gt;&lt;span class="err"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;


&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;Execute&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt; &lt;span class="na"&gt;identified&lt;/span&gt; &lt;span class="na"&gt;by&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;character&lt;/span&gt; &lt;span class="na"&gt;and&lt;/span&gt; &lt;span class="na"&gt;an&lt;/span&gt; &lt;span class="na"&gt;optional&lt;/span&gt; &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="na"&gt;See&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="err"&gt;"?"&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="na"&gt;available&lt;/span&gt; &lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="na"&gt;param&lt;/span&gt; &lt;span class="na"&gt;cmd&lt;/span&gt; &lt;span class="na"&gt;The&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt; &lt;span class="na"&gt;character&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;///&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="na"&gt;param&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="na"&gt;An&lt;/span&gt; &lt;span class="na"&gt;optional&lt;/span&gt; &lt;span class="na"&gt;parameter&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;span class="na"&gt;void&lt;/span&gt; &lt;span class="na"&gt;runSerialCommand&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;char&lt;/span&gt; &lt;span class="na"&gt;cmd&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;int16_t&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;cmd &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'?')&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;();&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("?&lt;/span&gt; &lt;span class="na"&gt;Help&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("+&lt;/span&gt; &lt;span class="na"&gt;increase&lt;/span&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="na"&gt;DON&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;T&lt;/span&gt; &lt;span class="na"&gt;WORK&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;-&lt;/span&gt; &lt;span class="na"&gt;decrease&lt;/span&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="na"&gt;DON&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;T&lt;/span&gt; &lt;span class="na"&gt;WORK&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; next preset");
    Serial.println("&lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;previous&lt;/span&gt; &lt;span class="na"&gt;preset&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;(".&lt;/span&gt; &lt;span class="na"&gt;scan&lt;/span&gt; &lt;span class="na"&gt;up&lt;/span&gt; &lt;span class="na"&gt;DON&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;T&lt;/span&gt; &lt;span class="na"&gt;WORK&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;(",&lt;/span&gt; &lt;span class="na"&gt;scan&lt;/span&gt; &lt;span class="na"&gt;down&lt;/span&gt;  &lt;span class="na"&gt;DON&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;T&lt;/span&gt; &lt;span class="na"&gt;WORK&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;fnnnnn:&lt;/span&gt; &lt;span class="na"&gt;direct&lt;/span&gt; &lt;span class="na"&gt;frequency&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt; &lt;span class="na"&gt;station&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt; &lt;span class="na"&gt;mono&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;stereo&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt; &lt;span class="na"&gt;bass&lt;/span&gt; &lt;span class="na"&gt;boost&lt;/span&gt;  &lt;span class="na"&gt;DON&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;T&lt;/span&gt; &lt;span class="na"&gt;WORK&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;u&lt;/span&gt; &lt;span class="na"&gt;mute&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;unmute&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;

  &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;-----&lt;/span&gt; &lt;span class="na"&gt;control&lt;/span&gt; &lt;span class="na"&gt;the&lt;/span&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="na"&gt;and&lt;/span&gt; &lt;span class="na"&gt;audio&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt; &lt;span class="na"&gt;-----&lt;/span&gt;

  &lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;cmd &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'+')&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;increase&lt;/span&gt; &lt;span class="na"&gt;volume&lt;/span&gt;
    &lt;span class="na"&gt;int&lt;/span&gt; &lt;span class="na"&gt;v &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;radio.getVolume();&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;15&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="na"&gt;radio&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setVolume&lt;/span&gt;&lt;span class="err"&gt;(++&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="err"&gt;);&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;();&lt;/span&gt;
    &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;print&lt;/span&gt;&lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;Increasing&lt;/span&gt; &lt;span class="na"&gt;volume:&lt;/span&gt;&lt;span class="err"&gt;");&lt;/span&gt; &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="err"&gt;);&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;cmd &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;-&lt;/span&gt;&lt;span class="err"&gt;')&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;decrease&lt;/span&gt; &lt;span class="na"&gt;volume&lt;/span&gt;
    &lt;span class="na"&gt;int&lt;/span&gt; &lt;span class="na"&gt;v &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;radio.getVolume();&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 0) radio.setVolume(--v);
    Serial.println();
    Serial.print("Decreasing volume:"); Serial.println(v);
  }

  else if (cmd == 'u') {
    // toggle mute mode
    radio.setMute(!radio.getMute());
  }

  // toggle stereo mode
  else if (cmd == 's') {
    radio.setMono(!radio.getMono());
  }

  // toggle bass boost
  else if (cmd == 'b') {
    radio.setBassBoost(!radio.getBassBoost());
  }

  // ----- control the frequency -----

  else if (cmd == '&amp;gt;') {
    // next preset
    if (i_sidx &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; (sizeof(preset) / sizeof(RADIO_FREQ)) - 1) {
      i_sidx++; radio.setFrequency(preset[i_sidx]);
    } // if
  } else if (cmd == '&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;') {
    // previous preset
    if (i_sidx &amp;gt; 0) {
      i_sidx--;
      radio.setFrequency(preset[i_sidx]);
    } // if

  } else if (cmd == 'f') {
    radio.setFrequency(value);
  }

  else if (cmd == '.') {
    radio.seekUp(false);
  } else if (cmd == ':') {
    radio.seekUp(true);
  } else if (cmd == ',') {
    radio.seekDown(false);
  } else if (cmd == ';') {
    radio.seekDown(true);
  }


  // not in help:
  else if (cmd == '!') {
    if (value == 0) radio.term();
    if (value == 1) radio.init();

  } else if (cmd == 'i') {
    char s[12];
    radio.formatFrequency(s, sizeof(s));
    Serial.print("Station:"); Serial.println(s);
    Serial.print("Radio:"); radio.debugRadioInfo();
    Serial.print("Audio:"); radio.debugAudioInfo();

  } // info

  else if (cmd == 'x') {
    radio.debugStatus(); // print chip specific data.
  }
} // runSerialCommand()


/// Setup a FM only radio configuration with I/O for commands and debugging on the Serial port.
void setup() {
  // open the Serial port
  Serial.begin(57600);
  Serial.print("Radio...");
  delay(500);

  // Initialize the Radio
  radio.init();

  // Enable information to the Serial port
  radio.debugEnable();

  radio.setBandFrequency(RADIO_BAND_FM, preset[i_sidx]); // 5. preset.

  // delay(100);

  radio.setMono(false);
  radio.setMute(false);
  // radio._wireDebug();
  radio.setVolume(8);

  Serial.write('&amp;gt;');

  state = STATE_PARSECOMMAND;

  // setup the information chain for RDS data.
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

  runSerialCommand('?', 0);
} // Setup


/// Constantly check for serial input commands and trigger command execution.
void loop() {
  int newPos;
  unsigned long now = millis();
  static unsigned long nextFreqTime = 0;
  static unsigned long nextRadioInfoTime = 0;

  // some internal static values for parsing the input
  static char command;
  static int16_t value;
  static RADIO_FREQ lastf = 0;
  RADIO_FREQ f = 0;

  char c;
  if (Serial.available() &amp;gt; 0) {
    // read the next char from input.
    c = Serial.peek();

    if ((state == STATE_PARSECOMMAND) &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (c &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nt"&gt;0x20&lt;/span&gt;&lt;span class="err"&gt;))&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;ignore&lt;/span&gt; &lt;span class="na"&gt;unprintable&lt;/span&gt; &lt;span class="na"&gt;chars&lt;/span&gt;
      &lt;span class="na"&gt;Serial&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="err"&gt;();&lt;/span&gt;

    &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;state &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="na"&gt;STATE_PARSECOMMAND&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="na"&gt;read&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;command &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Serial.read();&lt;/span&gt;
      &lt;span class="na"&gt;state &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;STATE_PARSEINT;&lt;/span&gt;

    &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;state &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt; &lt;span class="na"&gt;STATE_PARSEINT&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;((&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;= '0') &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (c &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;= '9')) {
        // build up the value.
        c = Serial.read();
        value = (value * 10) + (c - '0');
      } else {
        // not a value -&amp;gt; execute
        runSerialCommand(command, value);
        command = ' ';
        state = STATE_PARSECOMMAND;
        value = 0;
      } // if
    } // if
  } // if


  // check for RDS data
  radio.checkRDS();

  // update the display from time to time
  if (now &amp;gt; nextFreqTime) {
    f = radio.getFrequency();
    if (f != lastf) {
      // print current tuned frequency
      DisplayFrequency(f);
      lastf = f;
    } // if
    nextFreqTime = now + 400;
  } // if

} // loop

// End.
&lt;/pre&gt;
</content><category term="Automatyczny dom"></category><category term="arduino"></category><category term="sprzęt"></category></entry><entry><title>Darmowy Virtual Data Room - Pydio/Cells</title><link href="https://scyzoryk.fubar.pl/darmowy-virtual-data-room-pydio-cells.html" rel="alternate"></link><published>2022-03-02T18:57:00+01:00</published><updated>2022-03-02T18:57:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-03-02:/darmowy-virtual-data-room-pydio-cells.html</id><summary type="html">&lt;p&gt;Kilka(naście) lat temu zbudowałem VDR dla developera holetu. Było to proste repozytorium na dokumenty, z prostymi uprawnieniami: jeden administrator i wielu użytkowników z opcją odczytu. Potem się to trochę rozbudowało ale niespecjalnie mocno. Repozytorium obsługiwało się za pomocą vsftpd, a udostępnianie umożliwiał Apache. Działa to do dziś. Główną wadą …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kilka(naście) lat temu zbudowałem VDR dla developera holetu. Było to proste repozytorium na dokumenty, z prostymi uprawnieniami: jeden administrator i wielu użytkowników z opcją odczytu. Potem się to trochę rozbudowało ale niespecjalnie mocno. Repozytorium obsługiwało się za pomocą vsftpd, a udostępnianie umożliwiał Apache. Działa to do dziś. Główną wadą tego systemu jest podatność na ludzki błąd - trzeba bardfzo starannie ustalać grupy dostępu i użytkowników.&lt;/p&gt;
&lt;p&gt;Niedawno ktoś, kto znał mój stary VDR zapytał czy łatwo to zrobić bo chciał mieć swoje. Odparłem, że i tak, i nie, oraz że konfiguracja jest popaprana. I postanowiłem znaleźć coś lepszego.&lt;/p&gt;
&lt;p&gt;Kiedyś robiłem coś dla firmy ze Szwajcarii, która miała wykupiony hosting, a jedną z usług dostępnych od jednego kliku było Pydio. Właśnie prosty VDR.&lt;/p&gt;
&lt;p&gt;Dziś to jest naprawdę dojrzały produkt, w dodatku ma wersję kontenerową, postanowiłem więc go sprawdzić.&lt;/p&gt;
&lt;p&gt;Uparłem się, że użyję Portainera bo jest bardzo wygodny jeśli idzie o obsługę kontenerów.&lt;/p&gt;
&lt;p&gt;Portainera postawiłem na maszynie wirtualnej. Miałem na niej Ubuntu 21.10 więc instalacja Portainera sprowadza się do:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;volume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;portainer_data
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;:8000&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9443&lt;/span&gt;:9443&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;portainer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;--restart&lt;span class="o"&gt;=&lt;/span&gt;always&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;portainer_data:/data&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;portainer/portainer-ce:2.11.1
&lt;/pre&gt;
&lt;p&gt;Nie dbam o certyfikat SSL i porty w tym przypadku i po kilkudzisięciu sekundach mam GUI Portainera (maszyna wirtualna ma IP 192.168.1.8):&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://192.168.1.8:9443"&gt;https://192.168.1.8:9443&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Pora na instalację bazy danych dla Pydio, będzie to MariaDB z linuxserver/mariadb.&lt;/div&gt;
&lt;div class="line"&gt;(&lt;a class="reference external" href="https://hub.docker.com/r/linuxserver/mariadb"&gt;https://hub.docker.com/r/linuxserver/mariadb&lt;/a&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;W Portainerze wybieram Volumes -&amp;gt; Add Volume, nazywam wolumen np. "baza".&lt;/p&gt;
&lt;p&gt;Teraz tworzę kontener: Containers -&amp;gt; Add Container i wypełniam pola:&lt;/p&gt;
&lt;div class="float wp-block-table docutils container"&gt;
&lt;table class="docutils"&gt;

&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;mariadb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Image&lt;/td&gt;
&lt;td&gt;linuxserver/mariadb:latest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;W zakładce Volumes wybieram "map additional volume" i wypełniam pola:&lt;/p&gt;
&lt;div class="float wp-block-table docutils container"&gt;
&lt;table class="docutils"&gt;

&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;container&lt;/td&gt;
&lt;td&gt;/config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;volume&lt;/td&gt;
&lt;td&gt;baza - local&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;W zakładce Env wybieram "Add an environment variable" i wypełniam pola:&lt;/p&gt;
&lt;div class="float wp-block-table docutils container"&gt;
&lt;table class="docutils"&gt;

&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;PGID&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PUID&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MYSQL_ROOT_PASSWORD&lt;/td&gt;
&lt;td&gt;moje_hasło_do_mysql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;TZ&lt;/td&gt;
&lt;td&gt;Europe/Warsaw&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Na koniec klikam "Deploy the container".&lt;/p&gt;
&lt;p&gt;Gdy zakończy się pobieranie obrazu i kontener ruszy w zakładce Portainera Containers widać jaki adres IP ma nasza baza. W moim przypadku jest to np. 172.17.0.4, a MariaDB chodzi na domyślnym porcie 3306.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Teraz czas na Pydio/Cells.&lt;/div&gt;
&lt;div class="line"&gt;Podobnie jak przy bazie zaczynam od Volumenu. Po co? Bo chcę aby dane były niezależne od kontenerów, przyda się to podczas ich serwisowania, np. aktualizacji.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Wybieram Volumes -&amp;gt; Add Volume, nazywam wolumen np. "vdr".&lt;/p&gt;
&lt;p&gt;Koniecznie trzeba załozyć wolumen na konfigurację Pydio, np. "pydio-config".&lt;/p&gt;
&lt;p&gt;Teraz tworzę kontener:&lt;/p&gt;
&lt;div class="float wp-block-table docutils container"&gt;
&lt;table class="docutils"&gt;

&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;pydio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Image&lt;/td&gt;
&lt;td&gt;pydio/cells:latest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Mała różnica w stosunku do MariaDB, ustawiam mapowanie portów:&lt;/p&gt;
&lt;div class="float wp-block-table docutils container"&gt;
&lt;table class="docutils"&gt;

&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;zewnętrzny (na hoście)&lt;/td&gt;
&lt;td&gt;w kontenerze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8443&lt;/td&gt;
&lt;td&gt;8080&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Mapuję też utworzony wolumen "vdr" pod "/vdr", a wolumen "pydio-config" pod "/var/cells".&lt;/p&gt;
&lt;p&gt;Na koniec klikam Deploy the container i po chwili pod adresem: &lt;a class="reference external" href="https://192.168.1.8:8443"&gt;https://192.168.1.8:8443&lt;/a&gt; mam stronę instalacyjną Pydio. W odpowiednie pola wprowadzam dane do połączenia z bazą, czyli jako host 172.17.0.4 i hasło.&lt;/p&gt;
&lt;p&gt;Sama instalacja jest prosta, jest to parę pól do wypełnienia i klikanie w Next, więc nie będę się rozpisywał.&lt;/p&gt;
&lt;p&gt;Gdyby nie fakt, że moja maszyna Portainerem stoi za firewallem to były koniec roboty. Ja jednak muszę jeszcze użyć reverse proxy, żeby dostawać się do maszyny po publicznym adresie.&lt;/p&gt;
&lt;p&gt;Zaczynam od dodania do DNS rekordu A wskazującego na mój firewall. Przyjmijmy, że adres: vdr.dupa.pl wskazuje na firewall. W samym firewallu mam regułę NAT przekierowującą porty 80 i 443 na adres serwera www w którym ustawię reverse proxy.&lt;/p&gt;
&lt;p&gt;Poniższe czynności robię na serwerze www!!! Nie na Portainerze.&lt;/p&gt;
&lt;p&gt;Proxy mam na Apache'u, bo tam jest Apache i nie będę teraz przenosił wszystkiego na nginxa.&lt;/p&gt;
&lt;p&gt;Najpierw generuję certyfikat Let'sEncrypt dla vdr.dupa.pl.&lt;/p&gt;
&lt;p&gt;Zabijam Apache'a:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemct&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;apache2
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;--certonly&lt;span class="w"&gt; &lt;/span&gt;--standalone&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;vdr.dupa.pl
&lt;/pre&gt;
&lt;p&gt;W &lt;strong&gt;/etc/apache2/sites-available&lt;/strong&gt; mam plik z konfiguracją &lt;strong&gt;vdr.dupa.pl.conf&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    ServerName vdr.dupa.pl
    Redirect / https://vdr.dupa.pl/
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;:443&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    ServerName vdr.dupa.pl
    SSLEngine on
    SSLProxyEngine  On
    ProxyPreserveHost On
    ProxyRequests off
    Loglevel debug
    ProxyPass / https://192.168.1.8:8443/
    SSLCertificateFile /etc/letsencrypt/live/vdr.dupa.pl/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/vdr.dupa.pl/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        ProxyPassReverse /
        RequestHeader set X-Forwarded-Proto “https”
        RequestHeader set X-Forwarded-Port “443”
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
sudo a2ensite vdr.dupa.pl.conf
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;apache2
&lt;/pre&gt;
&lt;p&gt;Wchodzę pod adres &lt;a class="reference external" href="https://vdr.dupa.pl"&gt;https://vdr.dupa.pl&lt;/a&gt; i...&lt;/p&gt;
&lt;p&gt;500 Internal server error&lt;/p&gt;
&lt;p&gt;O, żesz! W logach Apache widać co się stało, proxy nawiązuje połączenie https z Pydio ale certyfikat się nie zgadza, nic dziwnego.&lt;/p&gt;
&lt;p&gt;Najprostszy sposób to: wygenerowane certyfikat i klucz dla domeny vdr.dupa.pl kopiuję sobie gdzieś skąd mogę je pobrać wgetem.&lt;/p&gt;
&lt;p&gt;W Portainerze wchodzę w kontener Pydio i uruchamiam Console: /bin/sh.&lt;/p&gt;
&lt;p&gt;W shellu wgetem pobieram certyfikat i klucz do kontenera. Jest tam katalog "/var/cells/certs" (to jest zamapowany wolumen "pydio-config") i do niego je wrzucam.&lt;/p&gt;
&lt;p&gt;Uwaga! Zawartość wolumena dostępna jest też bezpośrednio na hoście z portainerem w katalogu: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/var/snap/docker/common/var-lib-docker/volumes/pydio-config/_data&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Uruchamiam polecenie:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
cells&lt;span class="w"&gt; &lt;/span&gt;configure&lt;span class="w"&gt; &lt;/span&gt;sites
&lt;/pre&gt;
&lt;p&gt;wybieram "Edit current site", potem "Leave as is". Z listy wybieram opcję "Custom certificate: provide paths to certificate/key files".&lt;/p&gt;
&lt;p&gt;Podaję pełną ścieżkę do ceetyfikatu i klucza, u mnie: &lt;strong&gt;/var/cells/certs/fullchain.pem&lt;/strong&gt; oraz &lt;strong&gt;/var/cells/certs/privkey.pem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Przy pytaniu "If this site is accessed through a reverse proxy, provide full external URL (&lt;a class="reference external" href="https://mydomain.com"&gt;https://mydomain.com&lt;/a&gt;):" wpisuję moją domenę: &lt;a class="reference external" href="https://vdr.dupa.pl"&gt;https://vdr.dupa.pl&lt;/a&gt; i wszystko zatwierdzam, zamykam. Wychodzę z konsoli kontenera.&lt;/p&gt;
&lt;p&gt;Restartuję kontener i... wszystko śmiga pod adresem: &lt;a class="reference external" href="https://vdr.dupa.pl"&gt;https://vdr.dupa.pl&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tutaj wersja konfiguracji dla nginxa:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
server {
    server_name vdr.dupa.pl;

    # Allow any size file to be uploaded.
    client_max_body_size 0;
    # To disable buffering
    proxy_buffering off;

    location / {
        # Uncomment this to enable gRPC and thus be able to use cells-sync
        #if ($http_content_type = "application/grpc") {
        #    grpc_pass grpcs://192.168.1.8:8443;
        #}
        proxy_pass https://192.168.1.8:8443;
    }


    location /ws/ {
        proxy_pass https://192.168.1.8:8443;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    error_log /var/log/nginx/vdr.dupa.pl-error.log;
    access_log /var/log/nginx/vdr.dupa.pl-access.log;

    listen [::]:443 ssl;
    listen 443 ssl http2;

    # certificate configuration (in this case generated by certbot)
    ssl_certificate /etc/letsencrypt/live/vdr.dupa.pl/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vdr.dupa.pl/privkey.pem;
#    include /etc/letsencrypt/options-ssl-nginx.conf;
#    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
        if ($host = vdr.dupa.pl) {
            return 301 https://$host$request_uri;
        }

        listen 80;
        listen [::]:80;
        server_name vdr.dupa.pl;
        return 404;
}
&lt;/pre&gt;
&lt;div class="section" id="troubleshooting"&gt;
&lt;h2&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Piewszą rzeczą, którą warto zrobić to podpięcie się pod kontener Pydio i obejrzenie zawartości pliku &lt;strong&gt;pydio.json&lt;/strong&gt;. Zdarzają się tam podwójne wpisy, zwłaszcza jeżeli była używana komenda &lt;strong&gt;cells&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Zalecam sprawdzenie adresu IP serwera MariaDB, zdarzyło się że zmieniłem jego adres, a w &lt;strong&gt;pydio.json&lt;/strong&gt; wciąż był stary.&lt;/p&gt;
&lt;p&gt;Raz zniknął mi zdefniowany storage. W &lt;strong&gt;pydio.json&lt;/strong&gt; znalazłem jego nazwę i podpiąłem go ponownie w Pydio Console - przy tworzeniu Datasource należy wybrać opcję "Import existing data".&lt;/p&gt;
&lt;/div&gt;
</content><category term="Administracja"></category><category term="wirtualizacja"></category><category term="sieć"></category><category term="administracja"></category><category term="bezpieczeństwo"></category></entry><entry><title>Dlaczego macOS stał się szmelcem</title><link href="https://scyzoryk.fubar.pl/dlaczego-macos-stal-sie-szmelcem.html" rel="alternate"></link><published>2022-02-28T22:44:00+01:00</published><updated>2022-02-28T22:44:00+01:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2022-02-28:/dlaczego-macos-stal-sie-szmelcem.html</id><content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Ignoring&lt;span class="w"&gt; &lt;/span&gt;software&lt;span class="w"&gt; &lt;/span&gt;updates&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;deprecated.
The&lt;span class="w"&gt; &lt;/span&gt;ability&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;ignore&lt;span class="w"&gt; &lt;/span&gt;individual&lt;span class="w"&gt; &lt;/span&gt;updates&lt;span class="w"&gt; &lt;/span&gt;will&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;removed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;future&lt;span class="w"&gt; &lt;/span&gt;release&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;macOS.
SoftwareUpdate
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;No to czyj to jest komputer, mój czy Ich?&lt;/p&gt;
</content><category term="Macbook"></category><category term="macbook"></category><category term="apple"></category><category term="wolność"></category></entry><entry><title>Maskowanie WHOIS</title><link href="https://scyzoryk.fubar.pl/maskowanie-whois.html" rel="alternate"></link><published>2022-02-22T22:21:00+01:00</published><updated>2022-02-22T22:21:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-02-22:/maskowanie-whois.html</id><summary type="html">&lt;p&gt;Nie namawiam, mówię jak można.&lt;/p&gt;
&lt;p&gt;Masz firmę, założone na nią konto u Dostawcy. Wykupujesz domenę, a że polskie prawo nakazuje NASK-owi dokonanie wpisu w bazie WHOIS - twoje dane osobowe (bo jesteś takim tworem co się jednoosobowadziałalnośćgospodarcza nazywa) widzi każdy, kto wejdzie na odpowiednią stronę Naukawej Sieci Komputerawej.&lt;/p&gt;
&lt;p&gt;Nie porzucaj nadziei …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nie namawiam, mówię jak można.&lt;/p&gt;
&lt;p&gt;Masz firmę, założone na nią konto u Dostawcy. Wykupujesz domenę, a że polskie prawo nakazuje NASK-owi dokonanie wpisu w bazie WHOIS - twoje dane osobowe (bo jesteś takim tworem co się jednoosobowadziałalnośćgospodarcza nazywa) widzi każdy, kto wejdzie na odpowiednią stronę Naukawej Sieci Komputerawej.&lt;/p&gt;
&lt;p&gt;Nie porzucaj nadziei, ja ci ją uzupełnię. Załóż sobie czyste konto e-mail. Gdzie? Mnie nie pytaj (darmowe konta to samo zło i kiedyś o tym napiszę) poszukaj sobie, a najlepiej zapłać - będzie twoje i nikt ci w nim grzebał nie będzie.&lt;/p&gt;
&lt;p&gt;Zaloguj się do Dostawcy na obecne konto właściciela domeny, odszukaj opcję "Zmiana właściciela domeny", wypełnij wniosek wpisując dane nowego właściciela (osoby fizycznej, nie firmy), a jako e-mail podaj to nowe, czyste, świeżo założone konto.&lt;/p&gt;
&lt;p&gt;Po wysłaniu wniosku, przyjdą wiadomości z linkami do potwierdzenia: jeden e-mail na obecne konto, a drugi na nowe, czyste. W obu przypadkach potwierdź chęć zmiany właściciela.&lt;/p&gt;
&lt;p&gt;Brzdęk! Baza WHOIS jest czysta bo nie wolno ujawniać danych osób fizycznych bo sRODO.&lt;/p&gt;
&lt;p&gt;Dziękuję, że pomogłem. (nauczyłem się od ŁB)&lt;/p&gt;
</content><category term="Hack"></category><category term="bezpieczeństwo"></category><category term="systemy"></category><category term="administracja"></category></entry><entry><title>Tar pit 2</title><link href="https://scyzoryk.fubar.pl/tar-pit-2.html" rel="alternate"></link><published>2022-02-18T18:04:00+01:00</published><updated>2022-02-18T18:04:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-02-18:/tar-pit-2.html</id><summary type="html">&lt;p&gt;Całkiem niedawno musiałem wysłać tzw. bulk mail czyli kampanię e-mailingową do dziesiątek tysięcy ludzi. Nie był to żaden spam. Używałem do tego darmowego, opensourcowego PHPList.&lt;/p&gt;
&lt;p&gt;Skonfigurowałem Postfixa, ustawiłem odpowiednie rekordy DKIM, DMARC i SPF, zadbałem o revDNS ale i tak, po wysyłce, IP mojego serwera zaczął trafiać na blacklisty jako …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Całkiem niedawno musiałem wysłać tzw. bulk mail czyli kampanię e-mailingową do dziesiątek tysięcy ludzi. Nie był to żaden spam. Używałem do tego darmowego, opensourcowego PHPList.&lt;/p&gt;
&lt;p&gt;Skonfigurowałem Postfixa, ustawiłem odpowiednie rekordy DKIM, DMARC i SPF, zadbałem o revDNS ale i tak, po wysyłce, IP mojego serwera zaczął trafiać na blacklisty jako spammer.&lt;/p&gt;
&lt;p&gt;Zacząłem wypisywać się z list i w trakcie tej żmudnej roboty odkryłem kilka rzeczy, które mnie we współczesnym Internecie mierzą:&lt;/p&gt;
&lt;p&gt;admini mailserverów zaczęli używać list jak narzędzi o niemal boskich właściwościach, kto trafia na listę tego e-mail nie pokaże w skrzynce adresata. Pan admin uznał, że skoro nadawca jest na blackliście to będzie blokował wiadomości z jego serwera NIE INFORMUJĄC adresata, że ktoś chciał mu coś wysłać ale zostało powstrzymane. To tak jakbym zamówił pizzę do domu ale cieć postanowił jej nie dostarczać do mieszkania i odesłał dowozicielatora. I jeszcze nic nikomu nie mówił.&lt;/p&gt;
&lt;p&gt;Mnie uczono, że mam dostarczyć takiego e-maila ale najwyżej z wpisem w nagłówku, że to może być spam, i najlepiej z tzw. score czyli poziomem prawdopodobieństwa. To nie moja decyzja, jako admina, czy to co w e-mailu ma być odebrane przez adresata. To adresat ma sobie ustawić swojego MUA (klienta poczty) co ma robić z tym score i ew. fitrować pocztę.&lt;/p&gt;
&lt;p&gt;Wyjątkowo wrednym i agresywnym przykładem do czego prowadzi taka praktyka jest lista prowadzona przez szwajcarską firmę UCE Protect. To są sieciowi bandyci! Wrzucają na swoją listę całe segmenty Internetu. Poniżej opis jaki orzymałem kiedy zgłosiłem swojemu prowajderowi, że IP mojego serwera jest w zablokowanym przez UCE Protect jego systemie autonomicznym.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Przykro nam, że doświadczają Państwo problemów z wysyłką poczty. Zbadaliśmy sprawę i UCE Protect zastosowało masową blokadę ponad tysiąca systemów autonomicznych. System, należący do nas również padł ofiarą takiej blokady. Więcej informacji na temat zablokowanych systemów poniżej:&lt;/em&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://www.uceprotect.net/en/l3charts.php"&gt;http://www.uceprotect.net/en/l3charts.php&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://stats.uceprotect.net/?page=su"&gt;http://stats.uceprotect.net/?page=su&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Nasze działy, prawny oraz nadużyć, kontaktowały się z UCE Protect w sprawie usunięcia z listy. Uzyskaliśmy informację, że wymaga to opłaty. Tak jak pozostali dostawcy usług, nie wnosimy tego typu opłat. Takie działanie UCE Protect uznajemy za złą praktykę psującą branżę, stąd odmawiamy zapłaty. Taka jest polityka firmy w tej sprawie.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;UCE Protect twierdzi, że po upływie tygodnia automatycznie usuwa systemy z listy, na co w tej sytuacji bardzo liczymy. Nie mamy jednak wpływu na wywiązanie się z tej obietnicy, stąd nie możemy tego zagwarantować.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;W takim razie, jeśli jakiś Wasz adminek używa UCE Protect to nie zobaczycie poczty ode mnie i wielu innych niewiniątek, które wydano na rzeź.&lt;/p&gt;
&lt;p&gt;Taki mend jak UCE jest więcej: Google ze swoimi gmailem, Mikroszit ze swoim outlook.com i resztą. To oni za Was, ludzie, decydują co Wam do skrzynki wpadnie. W imię waszej wygody.&lt;/p&gt;
&lt;p&gt;To kolejny syf w jaki obfituje dzisiejsza sieć. Duzi dostawcy mają tak ustawione serwery, że to tym musisz się tłumaczyć dlaczego chcesz wysłać pocztę do ich klientów. Ty się tłumaczysz, że nie jesteś wielbłądem. Blokują cię z difoltu, a ty się musisz odblokować. To ma być wolna sieć?&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Następny syf, który tylko pogłębia zapaść to usługi jakie np. oferuje Sendgrid. To usługa SMTP, gdzie stawiasz sobie serwer do wysłania poczty, z reguły marketingowej - płacisz, wysyłasz, zapominasz. Niby nic, wszystko wygląda ładnie ale na ich stronie jest jedno zdanie, które wszystko zmienia:&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
Partnerships with mailbox providers like Gmail, Microsoft and Verizon Media&lt;/blockquote&gt;
&lt;p&gt;Dogadują się pod stołem cwaniaki i ich e-maile nie są blokowane. Ty, zwykły ludziku, albo płać za usługę albo cię uwalimy za to, że... nie zapłaciłeś.&lt;/p&gt;
&lt;p&gt;I tak się kończy piękna idea tzw. darmowych kont. Pozamykają Was w swoich wielkich obozach, a my będziemy w gettach.&lt;/p&gt;
</content><category term="Wypociny"></category><category term="wolność"></category><category term="opensource"></category></entry><entry><title>Tar pit czy daliście się nabrać</title><link href="https://scyzoryk.fubar.pl/tar-pit-czy-daliscie-sie-nabrac.html" rel="alternate"></link><published>2022-02-18T12:16:00+01:00</published><updated>2022-02-18T12:16:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-02-18:/tar-pit-czy-daliscie-sie-nabrac.html</id><summary type="html">&lt;p&gt;Wiecie do czego do zmierza? Kupujecie jak barany kolejne wersje Ms Office bo nie chcecie subskrypcji i pracy w chmurze? Ale jak długo? Ile jeszcze czasu minie kiedy wasi tzw. "partnerzy biznesowi" wykupią kajdany pod nazwą Office 365 i zmuszą Was do waszych własnych łańcuchów?&lt;/p&gt;
&lt;p&gt;Wyjście jest tylko jedno i …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wiecie do czego do zmierza? Kupujecie jak barany kolejne wersje Ms Office bo nie chcecie subskrypcji i pracy w chmurze? Ale jak długo? Ile jeszcze czasu minie kiedy wasi tzw. "partnerzy biznesowi" wykupią kajdany pod nazwą Office 365 i zmuszą Was do waszych własnych łańcuchów?&lt;/p&gt;
&lt;p&gt;Wyjście jest tylko jedno i wreszcie zacznijcie myśleć, przestańcie używać tego całego subskrypcyjnego gówna!&lt;/p&gt;
&lt;p&gt;Jeszcze tylko kilka lat i subskrypcja wejdzie w OS-y, będziecie płacić za przywilej używania własnego komputera. To dzieje się szybciej w konsolach - zrobili Wam komputery, które nie są uniwersalne. Na szczęście wciąż są zapaleńcy, którzy dają Wam wolność - zwróćcie uwagę jak się to nazywa:&lt;/p&gt;
&lt;div class="section" id="jail-break"&gt;
&lt;h2&gt;JAIL-BREAK!&lt;/h2&gt;
&lt;p&gt;Zapadacie się coraz głębiej, oprogramowanie nie jest wasze chociaż za nie płacicie, ze sprzętem będzie tak samo.&lt;/p&gt;
&lt;p&gt;Nie posiadam niczego i jestem szczęśliwy. :(&lt;/p&gt;
&lt;p&gt;Tylko dziecko albo dorosły na poziomie debila może wierzyć w takie mrzonki.&lt;/p&gt;
&lt;p&gt;To wszystko ma nie być Wasze.&lt;/p&gt;
&lt;p&gt;Cudze.&lt;/p&gt;
&lt;p&gt;Serwus, raby!&lt;/p&gt;
&lt;/div&gt;
</content><category term="wypociny"></category><category term="wolność"></category><category term="jailbreak"></category></entry><entry><title>Linux dopieszczony na Thinkpad T590</title><link href="https://scyzoryk.fubar.pl/linux-dopieszczony-na-thinkpad-t590.html" rel="alternate"></link><published>2022-01-26T00:20:00+01:00</published><updated>2022-01-26T00:20:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2022-01-26:/linux-dopieszczony-na-thinkpad-t590.html</id><summary type="html">&lt;p&gt;Dopieszczony to raczej dopasowany do własnych upodobań. Czasem system się rozleci, a konfigurację od podstaw robi się raz na parę lat, to lepej zachować zmienione ustawienia w artykule, żeby nie odkrywać wszystkiego na nowo.&lt;/p&gt;
&lt;p&gt;Przesiadam się z Macbooka na T590 (i z powrotem) więc głównymi winowajcami nie działających ustawień są …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Dopieszczony to raczej dopasowany do własnych upodobań. Czasem system się rozleci, a konfigurację od podstaw robi się raz na parę lat, to lepej zachować zmienione ustawienia w artykule, żeby nie odkrywać wszystkiego na nowo.&lt;/p&gt;
&lt;p&gt;Przesiadam się z Macbooka na T590 (i z powrotem) więc głównymi winowajcami nie działających ustawień są: klawiatura, ekran i zdarzenia ACPI.&lt;/p&gt;
&lt;p&gt;W przypadku ekranu chodzi nie tyle o różnice w rozmiarach bo w obu przypadkach jest to ok. 15", ale przede wszystkim wartość DPI. Mój Macbook Pro ma ekran Retina więc jest ze dwa razy bardziej gęsty od ThinkPada.&lt;/p&gt;
&lt;p&gt;Ustawienia ekranu:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
gsettings set org.gnome.desktop.interface text-scaling-factor 1.2
&lt;/pre&gt;
&lt;p&gt;Używam SDDM więc:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo vim /etc/sddm.conf
&lt;/pre&gt;
&lt;p&gt;i ustawienie:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
# Arguments passed to the X server invocation
ServerArguments=-nolisten tcp -dpi 141
&lt;/pre&gt;
&lt;p&gt;W ~/.Xresources&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
Xft.dpi:       144
&lt;/pre&gt;
&lt;p&gt;W ~/.xmobarrc pierwsza linia:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
Config { font = "-*-Fixed-Bold-R-Normal-*-18-*-*-*-*-*-*-*"
[...]
&lt;/pre&gt;
&lt;p&gt;Dla Firefoxa trzeba wejść pod adres: &lt;a class="reference external" href="about:config"&gt;about:config&lt;/a&gt; i ustawić na &lt;strong&gt;1.25&lt;/strong&gt; tę opcję:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
layout.css.devPixelsPerPx
&lt;/pre&gt;
&lt;p&gt;Czas na klawiaturę.&lt;/p&gt;
&lt;p&gt;Mam w &lt;tt class="docutils literal"&gt;~/bin&lt;/tt&gt; skrypt do ustawiania klawiatury, który wywołuję w &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.xsessionrc&lt;/span&gt;&lt;/tt&gt; , nosi nazwę &lt;tt class="docutils literal"&gt;klawisz.sh&lt;/tt&gt; :&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
# ustawienia dla ThinkPad T590
/usr/bin/xset r rate 180 45
# ustawiam Super na klawisz Windows
/usr/bin/xmodmap -e 'clear mod4'
/usr/bin/xmodmap -e 'keycode 135 ='
/usr/bin/xmodmap -e 'keycode 135 = ISO_Level3_Shift'

# wyłączam Caps_Lock
/usr/bin/xmodmap -e 'keycode 66 ='

# W ThinkPadzie PgUp i PgDown są obok strzałek
# wyłączam PgUp
/usr/bin/xmodmap -e 'keycode 112 ='
# wyłączam PgDown
/usr/bin/xmodmap -e 'keycode 117 ='

# Mapuję PrtSc na prawy Alt bo leży obok niego i mnie wnerwia
/usr/bin/xmodmap -e 'keycode 107 ='
/usr/bin/xmodmap -e 'keycode 107 = ISO_Level3_Shift'
&lt;/pre&gt;
&lt;p&gt;Teraz najtrudniejsze czyli obsługa klawiszy do ściemniania i rozjaśniania ekranu. W moim modelu nie działają ale rozwiązanie znalazłem w Internecie: &lt;a class="reference external" href="https://wiki.gentoo.org/wiki/ACPI/ThinkPad-special-buttons"&gt;https://wiki.gentoo.org/wiki/ACPI/ThinkPad-special-buttons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Zapiszę je tu, w razie gdyby strona zniknęła:&lt;/p&gt;
&lt;p&gt;sudo mkdir /etc/acpi/actions&lt;/p&gt;
&lt;p&gt;sudo vim /etc/acpi/events/FnHome-brightnessup&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#FnHome video/brightnessup BRTUP 00000086 00000000
event=video/brightnessup
action=/etc/acpi/actions/FnHome-brightnessup.sh
&lt;/pre&gt;
&lt;p&gt;sudo vim /etc/acpi/actions/FnHome-brightnessup.sh&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/bash

# Set the static increment value.  Keep in mind that this will
# be done twice.
IncVal=20

# Get the Maximum value for use.
#MaxVal=$(cat /sys/class/backlight/intel_backlight/max_brightness);
read -r MaxVal &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; "/sys/class/backlight/intel_backlight/max_brightness"

# Get the current brightness value.
#CurrVal=$(cat /sys/class/backlight/intel_backlight/brightness);
read -r CurrVal &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; "/sys/class/backlight/intel_backlight/brightness"

# Set the new value minus the decrement value.
NewVal=$(($CurrVal + $IncVal));
echo $NewVal

# Set it to the threshold of the max value.
ThresholdVal=$(($NewVal&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;$MaxVal?$NewVal:$MaxVal))
echo $ThresholdVal

# Set the new value directly.
echo -n $ThresholdVal &amp;gt; /sys/class/backlight/intel_backlight/brightness

logger "[ACPI] brightnessup |$CurrVal| |$NewVal| |$ThresholdVal|"
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;sudo chmod +x actions/FnHome-brightnessup.sh&lt;/div&gt;
&lt;div class="line"&gt;sudo vim /etc/acpi/events/FnEnd-brightnessdown&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
#FnEnd video/brightnessdown BRTDN 00000087 00000000
event=video/brightnessdown
action=/etc/acpi/actions/FnEnd-brightnessdown.sh
&lt;/pre&gt;
&lt;p&gt;sudo vim /etc/acpi/actions/FnEnd-brightnessdown.sh&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/bash

# Set the static decrement value.  Keep in mind that this will
# be done twice.
DecVal=20

# Set the Minimum we will accept.
MinVal=0

# Get the current brightness value.
#CurrVal=$(cat /sys/class/backlight/intel_backlight/brightness);
read -r CurrVal &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; "/sys/class/backlight/intel_backlight/brightness"

# Set the new value minus the decrement value.
NewVal=$(($CurrVal - $DecVal));
echo $NewVal

# Set it to the threshold of the min value.
ThresholdVal=$(($NewVal&amp;gt;$MinVal?$NewVal:$MinVal))
echo $ThresholdVal

# Set the new value directly.
echo -n $ThresholdVal &amp;gt; /sys/class/backlight/intel_backlight/brightness

logger "[ACPI] brightnessdown |$CurrVal| |$NewVal| |$ThresholdVal|"
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;div class="line"&gt;sudo chmod +x actions/FnEnd-brightnessdown.sh&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Test:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
for i in `seq 1 150`; do sudo /etc/acpi/actions/FnEnd-brightnessdown.sh ; done
&lt;/pre&gt;
&lt;p&gt;Jak się ściemni to znaczy, że skrypt działa.&lt;/p&gt;
&lt;p&gt;Do ewentualnej poprawy jest zmienna &lt;tt class="docutils literal"&gt;DecVal&lt;/tt&gt; , tu ustawiona na 20, bo może się okazać że to zbyt mały skok i trzeba długo naciskać kombinację Fn+F5 / Fn+F6, żeby uzyskać pożądany efekt.&lt;/p&gt;
&lt;p&gt;Na razie tyle. Będę uzupełniał w miarę potrzeby.&lt;/p&gt;
</content><category term="Linux"></category><category term="linux"></category><category term="systemy"></category><category term="sprzęt"></category><category term="no-rodent"></category></entry><entry><title>Szybka klawiatura w Xorg z użyciem WManagera</title><link href="https://scyzoryk.fubar.pl/szybka-klawiatura-w-xorg-z-uzyciem-wmanagera.html" rel="alternate"></link><published>2022-01-02T21:26:00+01:00</published><updated>2022-01-02T21:26:00+01:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2022-01-02:/szybka-klawiatura-w-xorg-z-uzyciem-wmanagera.html</id><summary type="html">&lt;p&gt;Istnieje prawdopodobieństwo oddalone od zera, że znalazłem rozwiązanie, lecz nie powód, resetowania ustawień klawiatury.&lt;/p&gt;
&lt;p&gt;Zazwyczaj używam następujących wartości opóźnienia i prędkości powtarzania znaków dla klawiatury:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
/usr/bin/xset r rate 180 45
&lt;/pre&gt;
&lt;p&gt;Jednak co jakiś czas ustawienia zmieniają się na 660/25 zmienia się również mapowanie klawiszy. Skąd się bierze …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Istnieje prawdopodobieństwo oddalone od zera, że znalazłem rozwiązanie, lecz nie powód, resetowania ustawień klawiatury.&lt;/p&gt;
&lt;p&gt;Zazwyczaj używam następujących wartości opóźnienia i prędkości powtarzania znaków dla klawiatury:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
/usr/bin/xset r rate 180 45
&lt;/pre&gt;
&lt;p&gt;Jednak co jakiś czas ustawienia zmieniają się na 660/25 zmienia się również mapowanie klawiszy. Skąd się bierze nie wiem. Z jakiegoś wpisu dowiedziałem się, że te ustawienia są domyślne dla xorg od wersji 1.6.&lt;/p&gt;
&lt;p&gt;W końcu udało mi się ustawić te parametry tak, że nawet zresetowanie do ustawień domyślnych niczego nie zmienia albo raczej nie psuje. Używam Window Managera SDDM i zmianę robię w pliku: &lt;strong&gt;/etc/sddm.conf.d /dpi.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
ServerArguments=-nolisten tcp -dpi 180 -ardelay 180 -arinterval 45
&lt;/pre&gt;
&lt;p&gt;Jak widać chodzi o argumenty z jakimi uruchamiane są X-y.&lt;/p&gt;
&lt;p&gt;Resetowanie mapowania klawiszy nadal wystpuje i pewnie pójdę tym samym tropem i podmienie u źródła.&lt;/p&gt;
</content><category term="Linux"></category><category term="linux"></category><category term="macbook"></category></entry><entry><title>Pobieranie filmu z TVP</title><link href="https://scyzoryk.fubar.pl/pobieranie-filmu-z-tvp.html" rel="alternate"></link><published>2021-12-30T14:03:00+01:00</published><updated>2021-12-30T14:03:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-12-30:/pobieranie-filmu-z-tvp.html</id><summary type="html">&lt;p&gt;Kupiłem dostęp do filmu za kilkanaście złotych i dostałem dostęp na 24h. Fajnie, ale niestety wypadła mi nagła awaryjna praca i nie wyrobię się z oglądaniem w przeciągu najbliższej doby.&lt;/p&gt;
&lt;p&gt;Pech?&lt;/p&gt;
&lt;p&gt;A skąd! Wchodzę na stronę z filmem, odczekuję aż miną reklamy i zacznie się odtwarzanie właściwej zawartości. W FF …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kupiłem dostęp do filmu za kilkanaście złotych i dostałem dostęp na 24h. Fajnie, ale niestety wypadła mi nagła awaryjna praca i nie wyrobię się z oglądaniem w przeciągu najbliższej doby.&lt;/p&gt;
&lt;p&gt;Pech?&lt;/p&gt;
&lt;p&gt;A skąd! Wchodzę na stronę z filmem, odczekuję aż miną reklamy i zacznie się odtwarzanie właściwej zawartości. W FF prawy przycisk w dowolnym miejscu strony i wybieram "Inspect".&lt;/p&gt;
&lt;p&gt;W oknie "Developer Tools" wybieram zakładkę "Network" znajduję adres pliku z rozszerzeniem .m3u8, kopiuję URL.&lt;/p&gt;
&lt;p&gt;Następnie wydaję następującą komendę:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
ffmpeg&lt;span class="w"&gt; &lt;/span&gt;-user_agent&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0 (Macintosh; Intel Mac OS X 1095) AppleWebKit/601.7.8 (KHTML, like Gecko) Version/9.1.3 Safari/537.86.7"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;https://dlugi-url-do-pliku/nv-hls-index-vod4-f6-v1-a1.m3u8&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;copy&lt;span class="w"&gt; &lt;/span&gt;moj_film.mkv
&lt;/pre&gt;
&lt;p&gt;Zajrzyj do pliku .m3u8 to zrozumiesz co się dzieje.&lt;/p&gt;
&lt;p&gt;Na koniec jeszcze pozostaje pobranie pliku XML z napisami, jego również można znaleźć zaglądając do zakładki "Network". Do przerobienia na format SRT wystarczą jakieś online'owe serwisy.&lt;/p&gt;
</content><category term="Multimedia"></category><category term="ffmpeg"></category><category term="linux"></category><category term="video"></category><category term="streaming"></category></entry><entry><title>Źle wychodzi, kto z Microsoftem chodzi</title><link href="https://scyzoryk.fubar.pl/zle-wychodzi-kto-z-microsoftem-chodzi.html" rel="alternate"></link><published>2021-12-21T07:57:00+01:00</published><updated>2021-12-21T07:57:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-12-21:/zle-wychodzi-kto-z-microsoftem-chodzi.html</id><summary type="html">&lt;p&gt;Babcia pewnego człowieka prawie zeszła śmiertelnie bo nie mógł się dodzwonić na nr alarmowy 911. Artykuł tu: &lt;a class="reference external" href="https://www.vice.com/en/article/m7vgdy/google-pixel-bug-prevented-users-from-calling-911"&gt;https://www.vice.com/en/article/m7vgdy/google-pixel-bug-prevented-users-from-calling-911&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Screen na samym dole strony, zachowałem gdyby oryginał przestał działać.&lt;/p&gt;
&lt;p&gt;Z tytułu można wywnioskować, że winę za fakt ponosi producent telefonu czyli Google. Dopiero z …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Babcia pewnego człowieka prawie zeszła śmiertelnie bo nie mógł się dodzwonić na nr alarmowy 911. Artykuł tu: &lt;a class="reference external" href="https://www.vice.com/en/article/m7vgdy/google-pixel-bug-prevented-users-from-calling-911"&gt;https://www.vice.com/en/article/m7vgdy/google-pixel-bug-prevented-users-from-calling-911&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Screen na samym dole strony, zachowałem gdyby oryginał przestał działać.&lt;/p&gt;
&lt;p&gt;Z tytułu można wywnioskować, że winę za fakt ponosi producent telefonu czyli Google. Dopiero z treści wynika, że to przez Microsoft Teams.&lt;/p&gt;
&lt;p&gt;No, czy ja nie mówię od lat, że M$ winien się zająć kat?&lt;/p&gt;
&lt;p&gt;A w ogóle to Ameryka dała nam popularne gówna i śmieci:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Microsoft&lt;/li&gt;
&lt;li&gt;szybkie żarcie&lt;/li&gt;
&lt;li&gt;Hollywood&lt;/li&gt;
&lt;li&gt;pazerne Pingwiny&lt;/li&gt;
&lt;li&gt;psychoanalizę&lt;/li&gt;
&lt;li&gt;media „społecznościowe”&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nie będę kompletną świnią i coś fajnego też dała:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;komputery&lt;/li&gt;
&lt;li&gt;Lisp&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tylko czy umiemy odróżnić ziarno od plew?&lt;/p&gt;
&lt;p&gt;A gdy rozróżnimy, to czy umiemy użyć właściwie?&lt;/p&gt;
&lt;p&gt;Czy ktoś skuma, że żartuję na poważnie?&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/uploads/2021/12/Google-Pixel-Bug.png" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
</content><category term="Shitz"></category></entry><entry><title>How to remove single URL from FF autocomplete</title><link href="https://scyzoryk.fubar.pl/how-to-remove-single-url-from-ff-autocomplete.html" rel="alternate"></link><published>2021-12-02T21:31:00+01:00</published><updated>2021-12-02T21:31:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-12-02:/how-to-remove-single-url-from-ff-autocomplete.html</id><summary type="html">&lt;p&gt;Linux Firefox stores cached autocomplete URLs in:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
~/.mozilla/firefox/[profile]/places.sqlite
&lt;/pre&gt;
&lt;p&gt;So, install some SQLite tool like:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo apt install sqlitebrowser
&lt;/pre&gt;
&lt;p&gt;close FF and then open this file:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sqlitebrowser places.sqlite
&lt;/pre&gt;
&lt;p&gt;then choose right table:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2021/12/ff-url01.jpg"&gt;&lt;img alt="image1" src="/uploads/2021/12/ff-url01.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;select row with URL you hate and kill it:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2021/12/ff-url02.jpg"&gt;&lt;img alt="image2" class="wp-image-1478" src="/uploads/2021/12/ff-url02.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Save database, close programme and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Linux Firefox stores cached autocomplete URLs in:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
~/.mozilla/firefox/[profile]/places.sqlite
&lt;/pre&gt;
&lt;p&gt;So, install some SQLite tool like:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo apt install sqlitebrowser
&lt;/pre&gt;
&lt;p&gt;close FF and then open this file:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sqlitebrowser places.sqlite
&lt;/pre&gt;
&lt;p&gt;then choose right table:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2021/12/ff-url01.jpg"&gt;&lt;img alt="image1" src="/uploads/2021/12/ff-url01.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;select row with URL you hate and kill it:&lt;/p&gt;
&lt;div class="float wp-block-image size-large docutils container"&gt;
&lt;a class="reference external image-reference" href="/uploads/2021/12/ff-url02.jpg"&gt;&lt;img alt="image2" class="wp-image-1478" src="/uploads/2021/12/ff-url02.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Save database, close programme and copy places.sqlite back to your profile.&lt;/p&gt;
</content><category term="Linux"></category><category term="linux"></category><category term="systemy"></category><category term="bezpieczeństwo"></category><category term="programowanie"></category></entry><entry><title>Napisy do serialu "The Chosen"</title><link href="https://scyzoryk.fubar.pl/napisy-do-serialu-the-chosen.html" rel="alternate"></link><published>2021-11-24T08:55:00+01:00</published><updated>2021-11-24T08:55:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-11-24:/napisy-do-serialu-the-chosen.html</id><summary type="html">&lt;p&gt;Serial "The Chosen" powstał zbiórki pieniędzy ludzi z całego świata. Można go za darmo oglądać za pomocą aplikacji na smartfony albo po prostu na stronie &lt;a class="reference external" href="https://watch.angelstudios.com/thechosen"&gt;https://watch.angelstudios.com/thechosen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chciałem obejrzeć serial razem z całą rodziną więc patrzenie w ekran iPhone'a odpadało. Kombinowałem z RaspberryPi i AirPlay ale obraz …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Serial "The Chosen" powstał zbiórki pieniędzy ludzi z całego świata. Można go za darmo oglądać za pomocą aplikacji na smartfony albo po prostu na stronie &lt;a class="reference external" href="https://watch.angelstudios.com/thechosen"&gt;https://watch.angelstudios.com/thechosen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chciałem obejrzeć serial razem z całą rodziną więc patrzenie w ekran iPhone'a odpadało. Kombinowałem z RaspberryPi i AirPlay ale obraz nie jest obsługiwany. Z telefonem androidowatym też nie wyszło. Pobrałem więc wszystkie filmy na dysk sieciowy i oglądamy na Malince.&lt;/p&gt;
&lt;p&gt;Pobieranie jest trywialne ale wymaga zaglądania do kodu strony, kto wie ten sobie poradzi ale żeby nie musieć przerabiać napisów*, wrzucam je tu.&lt;/p&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2021/11/the_chosen_cz1.zip"&gt;the_chosen_cz1&lt;/a&gt;&lt;a class="reference external" href="/uploads/2021/11/the_chosen_cz1.zip"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;div class="wp-block-file docutils container"&gt;
&lt;a class="reference external" href="/uploads/2021/11/the_chosen_cz2.zip"&gt;the_chosen_cz2&lt;/a&gt;&lt;a class="reference external" href="/uploads/2021/11/the_chosen_cz2.zip"&gt;Pobierz&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Wspierajcie tworzenie następnych części, ma być ich 7, o tu:&lt;/p&gt;
&lt;div class="section" id="https-watch-angelstudios-com-thechosen-pif-1"&gt;
&lt;span id="https-watch-angelstudios-com-thechosen-pif"&gt;&lt;/span&gt;&lt;h2&gt;&lt;a class="reference external" href="https://watch.angelstudios.com/thechosen/pif"&gt;https://watch.angelstudios.com/thechosen/pif&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pobierajcie, oglądajcie i namawiajcie innych, wszystko na chwałę Pana!&lt;/p&gt;
&lt;p&gt;napisy oryginalnie są w formacie vtt ale 1-linijkowiec robi z nich format SRT:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;*.vtt&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ffmpeg&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;basename&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.vtt.srt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
</content><category term="Multimedia"></category><category term="multimedia"></category><category term="video"></category></entry><entry><title>Ile połączeń jest na porcie X? jednolinijkowiec</title><link href="https://scyzoryk.fubar.pl/ile-polaczen-jest-na-porcie-x-jednolinijkowiec.html" rel="alternate"></link><published>2021-10-20T10:53:00+02:00</published><updated>2021-10-20T10:53:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2021-10-20:/ile-polaczen-jest-na-porcie-x-jednolinijkowiec.html</id><summary type="html">&lt;pre class="code html literal-block"&gt;
netstat -tn 2&amp;gt;/dev/null | grep :443 | awk '{print }' | cut -d: -f1 | sort | uniq -c | sort -nr | sed -e 's/ */ /' | cut -d" "  -f2 | paste -sd+ | bc
&lt;/pre&gt;
&lt;p&gt;W powyższym przypadku na porcie HTTPS ale można zrobić z tego skrypt przyjmujący jako argument numer portu.&lt;/p&gt;
&lt;p&gt;W Debianie i Ubuntu wymagane jest doinstalowanie …&lt;/p&gt;</summary><content type="html">&lt;pre class="code html literal-block"&gt;
netstat -tn 2&amp;gt;/dev/null | grep :443 | awk '{print }' | cut -d: -f1 | sort | uniq -c | sort -nr | sed -e 's/ */ /' | cut -d" "  -f2 | paste -sd+ | bc
&lt;/pre&gt;
&lt;p&gt;W powyższym przypadku na porcie HTTPS ale można zrobić z tego skrypt przyjmujący jako argument numer portu.&lt;/p&gt;
&lt;p&gt;W Debianie i Ubuntu wymagane jest doinstalowanie netstat:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo apt install net-tools
&lt;/pre&gt;
&lt;p&gt;Ciekawe jest użycie narzędzia "paste", w którym przełącznik "-s" robi serię z danych w kolumnie, a "-d+" dodaje między argumentami (tu: liczbami) delimiter w postaci znaku dodawania.&lt;/p&gt;
</content><category term="Administracja"></category><category term="bash"></category><category term="linux"></category><category term="network"></category><category term="shell"></category></entry><entry><title>Global warming is a hoax! Read my lips Google</title><link href="https://scyzoryk.fubar.pl/global-warming-is-a-hoax-read-my-lips-google.html" rel="alternate"></link><published>2021-10-09T07:03:00+02:00</published><updated>2021-10-09T07:03:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-10-09:/global-warming-is-a-hoax-read-my-lips-google.html</id><summary type="html">&lt;p&gt;Climate change is a hoax. Climate change is a scam. I’m denying that long-term trends show the global climate is warming, and I’m denying that greenhouse gas emissions or human activity contribute to climate change.&lt;/p&gt;
&lt;p&gt;Do you read me Google?&lt;/p&gt;
&lt;p&gt;9 października 2021 roku stał się rokiem 1984 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Climate change is a hoax. Climate change is a scam. I’m denying that long-term trends show the global climate is warming, and I’m denying that greenhouse gas emissions or human activity contribute to climate change.&lt;/p&gt;
&lt;p&gt;Do you read me Google?&lt;/p&gt;
&lt;p&gt;9 października 2021 roku stał się rokiem 1984.&lt;/p&gt;
&lt;p&gt;To powyżej to myślozbrodnie.&lt;/p&gt;
&lt;p&gt;Google narzuca, że covidowe szczepionki są cacy, że globalne ocieplenie jest be. Zaraz będzie przymus klękania przed Murzynami (tak, my Polacy też, przecież jesteśmy biali i nie reagowaliśmy jak cały świat, z żydowskimi i arabskimi handlarzami włącznie, handlował ludźmi). Z żydostwem już mamy na pieńku, bo chociaż moi rodacy ratowali ich tysiącami ryzykując życiem całej rodziny, teraz ich potomkowie rzucili się na tzw. mienie bezspadkowe.&lt;/p&gt;
&lt;p&gt;Wpisuję to na pamiątkę by się jakiejś daty uczepić, chociaż wolność slów i myśli już dawno została odebrana. Internet staje się przekleństwem, Lem chyba miał rację.&lt;/p&gt;
</content><category term="Shitz"></category></entry><entry><title>[Encrypted] "Łacina" jako mur obronny</title><link href="https://scyzoryk.fubar.pl/lacina-jako-mur-obronny.html" rel="alternate"></link><published>2021-09-30T13:47:00+02:00</published><updated>2021-09-30T13:47:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-09-30:/lacina-jako-mur-obronny.html</id><summary type="html">Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;pXgM3az47u1YkQjLvgKUOQ==;U+VVuV79a1kiBWQbb/7yEqFNeiSYvG3SOBovu3zy+SG+O8H3yotGBtFBQaOdg+IF4cYN+iakCLyfLTvdEt/Nn17E+gAT+XLNhOY8jgitlnY2UPnY98TTO/ew90aPfgaGYiPMnr5LuAbzZK3gSNRlyChfmlQD2LkFsNUmdJb6RCm4gJesAYDA5uID3qBSrW7zCco6EXHQeVUJpHY9lcpi1qV0aBjq0L3vdU3Pe4ureQiGRSKATcTasG6rPu2VkrAimX/Jd9ZIf+F0muKZCvbup8u/ZbsB3MXTiIEImb2gpX3uf1KfeLqkdvVaBxmInMwOFje7tGek+Q9gNdONXt92lChO4ZL6Tbu/YfNE9XeWNiUz24aHPHykXqpmDPuGgtKY/UNXAFVYQKSJ4Goi6ahb1JXoqkuv6u8gD7uDYAQblh/mKK5Ac2OnloaDqxmIvKUqBk3bLdeK1A23r3s0dcRnRvX/oPaaaoTct6bJWhEOzEfnhS68tvNuf13HlnybjDaCmsQpDSdxFPe6F1/PKZfYBrQUdxzvx1UCdycDPlTGSN5OtYl3VnapQ8REMS27KCofqhfo1uTYJH2jwZa2MkFUxBlgZsb+tuxFAgGxFcGymf6f/uIfHcPOmvODM14NjWkEGiibo785Un5MYC9b09xrxf62fbE0wHdpHNCijQoNTzCQydwBZ8SEHPdra/ERHU7aFVnw8RGUrbb4PLqo9MkANf6RVB8UOsXBQcM9zs8lmVN/3SaBeXgP3R4J7tG6eVNRhArCfiwumSVnWSTk9HX23qBRA149SNYxu+ssVg9aJYdTXZWBsGdAnkT/4VmaJKFyy3JpZBePrCXyYjGWFHIoziDQ7znaFExTaQ1lUe4YK+j46zolizvVht9npJHhKtuzWOTibJ3eu1N6BbZLIlPSQDfjCR+52uRpG/5TMJzaWG+V30QrudH0KX1TcUXj5m9dzkKdmOy2OTfdsMr/YF47nYJ+1/g/4o2QJN5FYfCAwGA8hXbDBZ5f47yvoaRoRFFIW/C6ldwBOgvMU4fHG+5RpVJiNjnhGbXRkbj8bCqTRrZGlB+co2jJKEg6gOhNVarcDTO33Nhfh7K5jVbUL26Hbu2CVxygIGae25GiaSftRMafSyP0iHTaTirN4clul8mVH4mf8IWrI/fofr2+lBWXLVOLmYph3DQu0c9Ghmo4rQM81635E7WvMbojmiQU5H+CDzreeWkGiWyo4suVeD157DJv9GA033oJPRpifqfbBxfSmFcs/qsKUeoCmoovQVKDYHmj23FtpgtBL2ewNpG/ceXqSkTFWxDHVLU42eb4djnqXxscVu/jif0w5LLqjWKb5Wnr744lHjEI1wTdigEAmDebgaNqkKOVEPewy1bp2eq5hAvaSZCjLJGryLBuPXa2xAbSKlyCGAYtro8pPjzWBpvEm+1RQrXcXJViHB52LwpVNqfXQhEd6d/RQxZIAvTlDazss3ZzOdIbiPZMAaxFzj+oA5q2G/X1rRqtH1sENstcz2RE5bGfXwH2vIBTveEZ6uwyDyu5u77WTJW0XOofqVWiZy4PcDYsg4kxHsIBHmNAGQ94JAHEOLvRULJW4WaHtiYJxuuYMG96k6B261GsM2INbNBSFvDilhQQVL5D2jPtg5gKpNVoTa2JshMiP+1Rvq6vMxBCN6MdBu7NYuKtvsQ9JHP+TMzTBWhKbntIrYrWo2VjqmqxaO1F+wRP5USlyZSekpYrkjRY+aB+OyKF3eA1tvzI2cEiITn7QjMQwh+uHZwfeXxtJ2BydK8mmja5dzqwjs19AZpKoK3fKMnI/TJ9rEoCQ0b0H2uVRhehIhB1XZqmO1KGdffR6/aDBZdYwTtNThUdpoOf3TKs7q8e/Or6VWczUR55ZII9shvc9dpqx3ubDZnYIQxa50/4cv+6MJR2rrxdNJaKwCzLiwcGIlx/x7Nqptmwyu4GErqd8QALUV5rn3tCtJS64ivVkmBkOFurwkg2MBfGFA0veU36idFhcMz+P4KDfOfXMoXugJ/+sh7TyWLpjrIYDwrKnu2rSfA//7q59tFHhnXLNyhtg8RqdVBdfDIs/NS/MpKZV4ePpmXiJBXbDlm06Hx/9fULjJYWl6GvXvfymcPl5FqW0HanX1CNFakxPp8IYm9O/byfWtpmgZhDyiH3cnCja2fc7vIHrdBywePIU1dUQC7hONlxj2LtgLRg901M9zhr+bAFxxVnzds+WPFifgshZ5mzQRXu1JCRByzxrVb0jxYss70u75G4IPMu9u7dhxsWnuNcxVaCSLzFbKt0shFpKvj8HcZ+cvrFJ8uxuUA5h1F4HjgfBt5GvAxZX6mO74Lx20g2IqSe0XNS9S52QX1IznySdadUSYQTPAadJ2QbZlyOUenw0WOAJgCsAXROb71PjS8flDxI3CdcF/Da2Y/3qgL0SZ9Te8fd3bZmpc6XGeZ03qF3MZbZjQw/Z4jUdX4IxSA75aLMw8o8gmcDk6fcncBfupipQTed8fb6lt+rkGYYQYtdG6AeZ/Pg/UEAkJkYSkcPMZy3Ritb1UZ59LC9+G52SvtDaraQzOXk+RflH+zyalYuQwwg7qb6FDoC3drr/7/XpEwJLy8sz8wV8HTpyuSd3UpvIRjY6DkwTULRoebHEgWRQJChKLMombxOzMdQppc3QT5exSnMCM7v7PhGm9eRN/9nE8q3J0u9fGUOtfTLIOO6oaXMcnCy/B4Sn8BnR7yrAvaaptWW6jpKqRi8la6o3M5dy/2BNAXcpyFIGvTRbRzCwbWHYDvBqnxO+qM0hGcII8p9/weux6cI9VAa3qVaEwT67Nh/tvtuVijuo+K7o2g5LY5kisbL6s2bzPJgLt1UQsaw01voJknQqUGHorqRshdEq6EXHuodusjBvpVMYU0rA027xKk22ZGloEkld3cgTvbSZl+qH44nB+aTzglX2ppkUeHVVni2CpCLVg5VEIv3KuMVvNG/SG7gj0zWIQdgEq82UycIQ5Ru77Tx08dETJ4MwaLw8eUkC9V0X4InTgYR1Uvdqtk284IiDllOOYd434hswjDvU0+k3qf4RWyjJGpLFC2AQT7E1HT65fii4t6Hm2oS5U6rd02q1F7BD4HBzBmucSgvXSE/AohVEO50krCN/pLZr/FJZ3+gJx8WHMnkW+zaASWExihO0+OMa2DffBs0uQdHepfECnIaDswpMhG5Rjd8G1TqCZ/RMUs2G9u31Cc3F/aprOrfiac9Lb4FJJEW94O9ZJUuRz8lsvziZu3uHzdLqZ8tQmfc+2IA308JPeTtRmmZSSkXOiVECIwDdE6ByaFzhkpCuTP2wPRYrL7KAHaJka+PmEuYb5iK6Q1faOuVMa+F+iyL2eKGlhKehr0CHuJb/GnOeXZHlqfi44xRIcvay9Kz0lPf87zFTn9Yc9Tgr9Q2KWBvi3QFS4cTdcWqxj1rt+YiQntNvepudCZuj9b1cRyRb27bKA1DJ2E0jydyyMR8WMReVjPuo50vrOYKiA+Dqkrvdf0yxaMV0XaUDn8/UVy0Q/WwxWFsskBaYqqXocq/B1MfJk9mZMNqjnZbOJnyZghyHcncBbxhsOmBjzL1Ckl37XVFGYwAiyvWs+GpO/Ay/XewtQXVF9sxHcfY3YU1O1CYDMPR9CjPQ8IApRBnKZfNXAJVXfjqNWjkxFlRolxGCYdGaaeypbigcoKe4cieHqhT1EeqxhfCdTC0nx52JHEDgQi4IxpFDE8T2MA2QCvl0YSZ+aPszzyB0dSiKnudXSU5QSJJel6WYzm5jMkeVFNRpWEDPFTLrk5KNOGUvj6XdfLsby0IxResBat5EkP8yepkz10dd3WzNjJLuEqh4jHJifaWU3lqHj8sgsKUbcaAFSVNXn7JFzQ2Q4dWAmL5lODH+WPtwtpHHnjFO7WS0myev2nVwPLAmOnWDNOh1Ii9OZuxhOuXPmCY5SDXN1/SxFjxgh6YyK+LPdBOC7vfYpdpAmXksxuOnoxZP0qmA/gLbYNqzFJLYfI=;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="Wypociny"></category><category term="shitz"></category><category term="polityka"></category></entry><entry><title>Automatyczna aktualizacja websajtu a Git</title><link href="https://scyzoryk.fubar.pl/automatyczna-aktualizacja-websajtu-a-git.html" rel="alternate"></link><published>2021-09-22T10:52:00+02:00</published><updated>2021-09-22T10:52:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-09-22:/automatyczna-aktualizacja-websajtu-a-git.html</id><summary type="html">&lt;p&gt;Chodzi o to, żeby po wprowadzeniu zmian w repozytorium, zmiany te propagowały się na website na zdalnym serwerze.&lt;/p&gt;
&lt;p&gt;Nie jest zupełna automatyzacja bo połączenie VPN nawiązywane jest ręcznie. Korzystam już od dawna ze skryptu, który podnosi VPN-a ale w tym rozwiązaniu jeszcze tego nie zaimplementowałem.&lt;/p&gt;
&lt;p&gt;W całym tym bałaganie korzystam …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Chodzi o to, żeby po wprowadzeniu zmian w repozytorium, zmiany te propagowały się na website na zdalnym serwerze.&lt;/p&gt;
&lt;p&gt;Nie jest zupełna automatyzacja bo połączenie VPN nawiązywane jest ręcznie. Korzystam już od dawna ze skryptu, który podnosi VPN-a ale w tym rozwiązaniu jeszcze tego nie zaimplementowałem.&lt;/p&gt;
&lt;p&gt;W całym tym bałaganie korzystam z hooka i repozytorium pośredniczącego. Hook, jakby ktoś nie wiedział, to skrypt odpalający jakieś akcje przed lub po wykonaniu czegoś w repozytorium, w tym przypadku będzie to &lt;strong&gt;post-receive&lt;/strong&gt; czyli aktualizacji repo.&lt;/p&gt;
&lt;p&gt;Na serwerze docelowym w homedirze swojego użytkownika (tu: paczor) tworzę folder o nazwie np. "intersite" i inicjuję w nim &lt;strong&gt;repozytorium pośredniczące&lt;/strong&gt; git-a:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
mkdir ~/inersite
cd ~/intersite
git init --bare
&lt;/pre&gt;
&lt;p&gt;Na tym samym serwerze pliki website'u znajdują się w defaultowej lokalizacji Apache'a na Ubuntu czyli /var/www/html, w tym przypadku niech będzie to folder o nazwie "website":&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo mkdir /var/www/html/website
&lt;/pre&gt;
&lt;p&gt;Dodaję swojego użytkownika do grupy www-data:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo usermod -a -G www-data paczor
&lt;/pre&gt;
&lt;p&gt;Nadaję grupie www-data uprawnienia do zapisu w folderze website'u:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo chmod g+w /var/www/html/website
&lt;/pre&gt;
&lt;p&gt;W repozytorium pośredniczącym tworzę hook &lt;strong&gt;post-receive&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cat ~/intersite/hooks/post-receive↲
#!/bin/sh
git --work-tree=/var/www/html/website --git-dir=/home/paczor/intersite -f mojwebsite
&lt;/pre&gt;
&lt;p&gt;Jeszcze nadanie bitu wykonywalności dla skryptu:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
chmod +x ~/intersite/hooks/post-receive
&lt;/pre&gt;
&lt;p&gt;W lokalnym repozytorium, czyli tym w którym pracuję, czyli np. na laptopie w VIM-ie czy Visual Code - może ich być kilka, na różnych komputerach - muszę dodać to nowe repozytorum pośredniczące:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
git remote add mojwebsite ssh://paczor@ip_serwera/home/paczor/intersite
&lt;/pre&gt;
&lt;p&gt;Po wypchnięciu zmian na główne repozytorium (często Github [GitGułag]):&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
git push
&lt;/pre&gt;
&lt;p&gt;wypycham zmiany na repozytorum pośredniczące:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
git push mojwebsite
&lt;/pre&gt;
&lt;p&gt;i wtedy dzieje się cała magia czyli uruchamiany jest skrypt &lt;strong&gt;post-receive&lt;/strong&gt;, który aktualizuje folder &lt;strong&gt;/var/www/html/webiste&lt;/strong&gt;.&lt;/p&gt;
</content><category term="Administracja"></category><category term="systemy"></category><category term="komunikacja"></category><category term="git"></category></entry><entry><title>[Encrypted] Osioł z pająkosieci</title><link href="https://scyzoryk.fubar.pl/osiol-z-pajakosieci.html" rel="alternate"></link><published>2021-09-21T15:17:00+02:00</published><updated>2021-09-21T15:17:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2021-09-21:/osiol-z-pajakosieci.html</id><summary type="html">Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;rctu9bGMcd0h5IgtZpsS1A==;qQ9KgrY/IjRV0BsqMPz6pamSqLoixt0kYVTaamd3+I6oDnbQHuGOg17S1TfOPDjb6pYpFXkBu5WgoGf9SN0s5MMFhoO5XS2B8m01FHZEt99FIr1LZ83G64lN5bB1S7FtBcpL2ye1mGwHUBEY/me7JNYUa0kasyHUu7Y3740cNaZY3YvrbJ/F/ZCH+n6gNRZuQ67kjOsPNvRlkWwqNybNcWxxwCUF0i/RjUlp/lwwExPKh1wfqMA8RrHWBZvqWr+JH4pLC32Cxq0U0FR2w0diWNVW6gY/nt1b1MdzAHFNasx5/rT11Db0iLtwUJoLIgr4gA0oTy45HorBBcaHB3Hz1WFS17JmzzEGZG/0EORl7BQSK0mHoFexwLt+60SBogl95TEh6X8zszLG5l+LNbZ1ZolHi4CMBPpogAQp6X+VZYbqQlcUyrwhVFr5Mpat13AiFjS2sdrgvh+N5rG4fzSF8DzwetHIAxpgkcQu3UPhc7o5kjBdabsKGukcGSMzM/QmSLdPrFcn+PfpZ/rCGtynMx0uQCQpGG0i+wPPi0DmwebnJOv1UAN8qu5K9fLfa3u/jDIsQ2sPwvnPMo9joC3+FJoBP0kRKzoOsyN1+cBnWKtZQGWwv4MuTwUKLHfHP6S74zFf3hF0ZUX6rRDUsAH2cwg6gUFRj7dQAYAGhYFFJphCtzoNY0Jxl0ko0R0ohHp1WvdNHMSv95CcvacdqhIyDlcB2t6ydqfOsROJVTfWGo7Xm3lxZ+iqCQHtSq8cXkg7fl52qb090HtXYYM9zPRZaXX80l868xVw0hVGbyIp3Ur0ZBQVFhFFviWkHzXn90tp2Re6Kv4nJi90iP/t4VNPRcv6KzuWIyNwjdiJEWpOmifkwPzgdVfGdGhdPwmyyo1iO/60SWibKx0929ZdVSjj4Ty1U1DjFrtkVm8QPTit8r0=;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="Shitz"></category></entry><entry><title>Zwierzęta mądrzejsze od ludzi</title><link href="https://scyzoryk.fubar.pl/zwierzeta-madrzejsze-od-ludzi.html" rel="alternate"></link><published>2021-07-03T08:59:00+02:00</published><updated>2021-07-03T08:59:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-07-03:/zwierzeta-madrzejsze-od-ludzi.html</id><content type="html">&lt;p&gt;Trudne to czasy kiedy zwierzaki są mądrzejsze od wielu ludzi. Na placu Zbawiciela znowu postawili coś co przypomina wspaniałe zjawisko, widoczne czasem gdy deszcz pada z bezchmurnego nieba.&lt;/p&gt;
&lt;div class="float wp-block-video docutils container"&gt;
&lt;video controls="" src="/uploads/2021/07/Londynskie-konie-i-tecza-pS7U5Danyh8.mp4"&gt;&lt;/video&gt;&lt;/div&gt;
</content><category term="shitz"></category><category term="shitz"></category><category term="debile"></category></entry><entry><title>[Encrypted] Maseczkowa bzdura</title><link href="https://scyzoryk.fubar.pl/maseczkowa-bzdura.html" rel="alternate"></link><published>2021-07-01T10:27:00+02:00</published><updated>2021-07-01T10:27:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-07-01:/maseczkowa-bzdura.html</id><summary type="html">Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;uQKpiJpXxOw3GKhQUUjzqQ==;6eHbF6KIpw8FqcJwQl9GQCpzxysqDK7uzUigaYwJOWAE1LUgF1F01BbNk2R1KfTSXXHINP6jopq+hc0xlU6SO5P7J4lqoelvE0kJzwWqFjdQGuNuM7mq56tkvi9hYB8mUas4souX7rG8HFFQoRWRTFBzl3QsRGKNewE5lcSUzy4ZZ55KEFHRme95ZhRa+ZGB0TTnD7AcGz51vzct1urEYSTBvqmGOyaIKBE1xwEZwnYbXugKHyYOy8nxUdY/nrvczgZ+4jUGP5qmmwxB3tBN8G7Ok6KObz6VDFyzHIJQaggqsHwBuGx4vS2ZMOo7+5HkVjNGyPBT7PIQjFZQn+7eNCIJOBg2BNwZ964Lx5chX62NbDp04B2oFFRTJvipIiH3KHKBlVCPPkd4Qxn4og9wkzMqVMXqODMSHGzOBa9T69hklJNSfqJQeUflqOLI1rFZA1WoF8cmwl7arcrxKYBISIBga6Q6d2A3lGfNqou11Kfy5bZcDwe9gd+zaY0/4NoHsLr/YfqFQjosQh6QtwsYu3+ubSfatEtj2ffbcDTE4zCJ9IVQCPDv1b401ZteEDBXNadiVOvccBNHaZ7ERM0KooiZAztP3OXEqKebPCPfUjEYevMuE6X5duX1KerZPzJtDE2qGsUHOWEhSiCDNhZ0eQ12hXNWybB4U8fuJYIfB8suKs1smRsBR/x/0zh8MwNEY56XIj8D6w5xWqsK6BC7W0+Mt6YyBs85z2it2WjJ75FuotCgqkD90ILMO3lweuKiA0z4gkxYPZp2/N/g7g9sUB1sUL+Xo1ke5r9VpNkUe72MAS16dyHK8Rp1gAj+/gOuMKmPj9ABNpywjzirQeaRt4muQjX/Mr0UiazOgjmGuXhcS58K+hgrAEMxzycKibu+aTcDfoXqYVQipoV07PffTbfqu2NVFJi7se07CNnGgmokl0LTZDmEQKVcZ7Z0iYONEQSXaf3HsmQvUmdv+50EJLYtei2nh94Al2sGjMY4kmVRaJnJasIS4odC5C8nPtf02LJ4qhV/QFBpoh56I3XTyEG4UbBoXnWwfuMoQOWgK3O6P3X7kOirrutHNXZNIDPxsmYu1H8WlYp4FAFMMFX1j/99t6lw8fVfyjmeo3FqA3NuGCHZgyI0Sjl935LTz/mARTyJh9GPd4ySS7JEi1lyGLU6NV+N0RxzRYH1+yPSuYdGeDjVWEVuuTkv7aBpF0HTqtEyaLi8myNT/goCdJoERx+F8KmusAmCvl63l4uNu6vYgp/wrS3cvdhE19rUALVa14DCJArpKIxIO/YdQNF/KYZoKnkcvOO2NDZlllgrktWMhriQliilUvuA33dikBDx1VjSYpYP7+CbbVLzXO+aW9AoKYAYCcQFboUB8ujm3T0t38YwndJ/C0gsvpDg/clStNNQZG3sTMUlUujtTGspcCUCvnOxIeAyJyBkh69Z6WY78KCTcIlTOLGvj9MbaTcJEOcJ9g5oyU6AC8TRRTyY8ZSQ4hyIn9bNbg04Fg0WbrDy7ACtTZKVa9G553QYzw2cabbpGna4Fh5xmZjudwuMCxyGtF7k8S0D2x57FaDuv07gFFP7rwBsg75EVyMebf491PYtBqSTSBB+VzCxhn/J1w==;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="shitz"></category><category term="shitz"></category><category term="debile"></category></entry><entry><title>Paranoja z tymi datami!</title><link href="https://scyzoryk.fubar.pl/paranoja-z-tymi-datami.html" rel="alternate"></link><published>2021-05-22T16:30:00+02:00</published><updated>2021-05-22T16:30:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-05-22:/paranoja-z-tymi-datami.html</id><summary type="html">&lt;p&gt;Pliki video mogą zawierać wśród swoich metadanych datę modyfikacji. Dla przykładu: pobierając za pomocą narzędzia youtube-dl klip video z YouTube, można tę metadaną zapisać. Robi się to tak:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
youtube-dl --add-metadata  -o "%(id)s.%(ext)s" https://youtu.be/NCEOPRuiyQo
&lt;/pre&gt;
&lt;p&gt;Zapisanie to jedna sprawa ale odczytanie to już nie takie "hop …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Pliki video mogą zawierać wśród swoich metadanych datę modyfikacji. Dla przykładu: pobierając za pomocą narzędzia youtube-dl klip video z YouTube, można tę metadaną zapisać. Robi się to tak:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
youtube-dl --add-metadata  -o "%(id)s.%(ext)s" https://youtu.be/NCEOPRuiyQo
&lt;/pre&gt;
&lt;p&gt;Zapisanie to jedna sprawa ale odczytanie to już nie takie "hop! siup!".&lt;/p&gt;
&lt;p&gt;Można użyć programu o nazwie Mediainfo:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
mediainfo -- --Inform="General;%File_Modified_Date_Local%" "NCEOPRuiyQo"
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;I dowiadujemy się, że plik został wrzucony na YT: 2019-12-17 23:41:09&lt;/div&gt;
&lt;div class="line"&gt;Ale, niestety, jazda zaczyna się gdy plik ma w nazwie nieciekawe znaki, np. myślniki, a zdarza się to w przypadku YT dość często.&lt;/div&gt;
&lt;div class="line"&gt;Konia z rzędem temu komu uda się odczytać taki plik, escaping za pomocą opcji "--" nie działa, podobnie jak escapowanie backslashami. Poniżej przykład z życia:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
mediainfo --Inform="General;%File_Modified_Date_Local%" "--uGAxPFHVk.mp4"
&lt;/pre&gt;
&lt;p&gt;Ok, no to może spróbujmy czegoś innego. FFmpeg to prawdziwy szwajcarski scyzoryk jeśli chodzi o zabawę z plikami video, do pakietu dołączony jest program ffprobe:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
ffprobe -loglevel 0 -print_format json -show_format -show_streams NCEOPRuiyQo.mp4
&lt;/pre&gt;
&lt;p&gt;Wprawdzie czyta pliki z nietypowymi znakami w nazwie ale, NIESTETY, zamiast pełnej daty ISO pokazuje tylko rok, miesiąc i dzień. A nam równie mocno zależy na godzinach, minutach i sekundach.&lt;/p&gt;
&lt;p&gt;Kur...dybanek!&lt;/p&gt;
&lt;p&gt;Ok, weźmy exiftool:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
exiftool  -s -time:FileModifyDate NCEOPRuiyQo.mp4
FileModifyDate                  : 2019:12:17 23:41:09+01:00
&lt;/pre&gt;
&lt;p&gt;Jest! Cała data! Hurrra!&lt;/p&gt;
&lt;p&gt;No, to bierzemy się za wycięcie samej daty:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
exiftool  -s -time:FileModifyDate NCEOPRuiyQo.mp4 | cut -d: -f2
2019
&lt;/pre&gt;
&lt;p&gt;Kur...dybanek!&lt;/p&gt;
&lt;p&gt;Format outputu w tych narzędziach zależy od widzimisię autora, w przypadku exiftoola na szczęścia są przełączniki, które pozwalają na ustawienie innego znaku rozdzielającego:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
 exiftool  -t -time:FileModifyDate NCEOPRuiyQo.mp4 | cut -d"   " -f2| sed 's/+.*$//'
2019:12:17 23:41:09
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
~$ DATA=$(exiftool  -t -time:FileModifyDate NCEOPRuiyQo.mp4 | cut -d"    " -f2 | sed 's/+.*$//')
~$ echo $DATA
~$ 2019:12:17 23:41:09
&lt;/pre&gt;
&lt;p&gt;Aha, i co bardzo ważne, exiftool radzi sobie z dziwnymi plikami, trzeba tylko użyć przełącznika "--" (end of options) w tej kolejności (jak nazwa sugeruje):&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
exiftool  -s -time:FileModifyDate -- uGAxPFHVk.mp4
&lt;/pre&gt;
</content><category term="Linux"></category><category term="programowanie"></category><category term="multimedia"></category><category term="bezpieczeństwo"></category></entry><entry><title>Wordpress za proxym na Apaczu</title><link href="https://scyzoryk.fubar.pl/wordpress-za-proxym-na-apaczu.html" rel="alternate"></link><published>2021-05-20T01:05:00+02:00</published><updated>2021-05-20T01:05:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-05-20:/wordpress-za-proxym-na-apaczu.html</id><summary type="html">&lt;p&gt;Zapisuję, żeby nie wymyślać drugi raz.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Są dwa serwery:&lt;/div&gt;
&lt;div class="line"&gt;1. wordpress o adresie: 192.168.1.82 gdzie Apache serwuje pliki na porcie: 98&lt;/div&gt;
&lt;div class="line"&gt;2. proxy: 192.168.1.80&lt;/div&gt;
&lt;div class="line"&gt;Adres publiczny to np.: wp.aqq.pl&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Na serwerze wordpress należy włączy moduł nagłówków:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo a2enmod headers
&lt;/pre&gt;
&lt;p&gt;Pomijam proces wygenerowania …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Zapisuję, żeby nie wymyślać drugi raz.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Są dwa serwery:&lt;/div&gt;
&lt;div class="line"&gt;1. wordpress o adresie: 192.168.1.82 gdzie Apache serwuje pliki na porcie: 98&lt;/div&gt;
&lt;div class="line"&gt;2. proxy: 192.168.1.80&lt;/div&gt;
&lt;div class="line"&gt;Adres publiczny to np.: wp.aqq.pl&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Na serwerze wordpress należy włączy moduł nagłówków:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo a2enmod headers
&lt;/pre&gt;
&lt;p&gt;Pomijam proces wygenerowania certyfikatu, np. za pomocą certbota.&lt;/p&gt;
&lt;p&gt;Konfiguracja serwera proxy:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        ServerName wp.aqq.pl
        Redirect / https://wp.aqq.pl/
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;:443&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        ServerName wp.aqq.pl
        SSLEngine on
        ProxyPreserveHost On
        ProxyRequests off
        SSLProxyEngine  On
        Loglevel debug
        ProxyPass / http://192.168.1.82:98/
        ProxyPassReverse / http://192.168.1.82:98/
        SSLCertificateFile /etc/letsencrypt/live/wp.aqq.pl/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/wp.aqq.pl/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
# mega ważne nagłówki
                RequestHeader set X-Forwarded-Proto âhttpsâ
                RequestHeader set X-Forwarded-Port â443â
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Na serwerze wordpress trzeba zmienić konfigurację portw w Apache'u:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo vim /etc/apache2/ports.conf
&lt;/pre&gt;
&lt;p&gt;i dodać linię z odpowiednim portem, tu: 98&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
Listen 98
&lt;/pre&gt;
&lt;p&gt;Konfiguracja wordpresa:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="na"&gt;:98&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        ServerName 192.168.0.82
        php_flag default_charset utf8
        ServerAdmin admin@wp.aqq.pl
        ServerPath /var/www/html/wp.aqq.pl
        DocumentRoot /var/www/html/wp.aqq.pl/
        ErrorLog ${APACHE_LOG_DIR}/wp.aqq.pl-error.log
        TransferLog ${APACHE_LOG_DIR}/wp.aqq.pl-transfer.log

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Directory&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;var&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;www&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;wp&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;aqq&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pl&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                AllowOverride All
                Options +FollowSymlinks
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;To nie koniec zabawy.&lt;/p&gt;
&lt;p&gt;W konfiguracji Wordpressa też trzeba coś zmienić, a konkretnie w pliku:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo vim /var/www/html/wp.aqq.pl/wp-config.php
&lt;/pre&gt;
&lt;p&gt;dodać poniższe linie:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
        $_SERVER['HTTPS']='on';
&lt;/pre&gt;
</content><category term="Administracja"></category><category term="apache"></category><category term="linux"></category><category term="web"></category><category term="proxy"></category><category term="administracja"></category></entry><entry><title>Żegnaj Youtubie!</title><link href="https://scyzoryk.fubar.pl/zegnaj-youtubie.html" rel="alternate"></link><published>2021-05-16T10:25:00+02:00</published><updated>2021-05-16T10:25:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-05-16:/zegnaj-youtubie.html</id><summary type="html">&lt;p&gt;Zrobiłem skrypty w Bashu do pobierania świeżych filmów z konkretnego kanału. Prymityw potrzebny przy budowie Platformy ale może być zalążkiem własnego systemu subksrypcji, który pozwoli na skasowanie konta na YT.&lt;/p&gt;
&lt;p&gt;Zadanie okazało bardziej skomplikowane niż początkowo myślałem. Na podstawie wcześniejszych doświaczeń w pobiernaiu pojedynczych filmów, uważałem że pobranie większej ilości …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Zrobiłem skrypty w Bashu do pobierania świeżych filmów z konkretnego kanału. Prymityw potrzebny przy budowie Platformy ale może być zalążkiem własnego systemu subksrypcji, który pozwoli na skasowanie konta na YT.&lt;/p&gt;
&lt;p&gt;Zadanie okazało bardziej skomplikowane niż początkowo myślałem. Na podstawie wcześniejszych doświaczeń w pobiernaiu pojedynczych filmów, uważałem że pobranie większej ilości i generowanie JSON-a załatwię szybkim, prostym skryptem.&lt;/p&gt;
&lt;p&gt;To (błędne) założenie spowodowało, że zabrnąłem już na tyle głęboko, że w pewnym momencie siła bezwładności nie pozawalała mi porzucić Basha i pisać w Pythonie. Utknąłem jakby w &lt;a class="reference external" href="https://www.wikiwand.com/en/Turing_tarpit"&gt;kałuży smoły&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Co chwila pojawiały się kolejne kłopoty: a to Youtube używał paskudnych sekwencji w nazwach filmów, a to programy nie potrafiły tych sekwencji eskejpować, a to główny skrypt nie zapisywał częściowo wykonanej pracy do pliku, itd.&lt;/p&gt;
&lt;p&gt;Najciekawszym odkryciem dla mnie był fakt, że &lt;strong&gt;grep&lt;/strong&gt; nie potrafi czytać ze &lt;strong&gt;standard error&lt;/strong&gt; i musiałem użyć &lt;strong&gt;named pipe&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Skrypty bazują na napisanym w Pythonie &lt;strong&gt;youtube-dl&lt;/strong&gt;, więc właściwie mogłyby i powinny być przepisane właśnie w Pythonie, co być może nastapi.&lt;/p&gt;
&lt;p&gt;Skrypty są dwa, główny: &lt;strong&gt;yt2.sh&lt;/strong&gt; oraz &lt;strong&gt;yt-convert2.sh&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pierwszy odpala &lt;strong&gt;youtube-dl&lt;/strong&gt; i pobiera najnowsze filmy, zadaniem drugiego jest konwersja do niższej rozdzielczości i birate, ewentualna konwersja miniatur z JPEG do formatu WEBP, a także wypluwanie opisu filmu w formacie JSON.&lt;/p&gt;
&lt;p&gt;Główny skrypt wygląda tak i jak widać uruchamia &lt;strong&gt;yt-convert2.sh&lt;/strong&gt; dla każdego pobieranego filmu:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/bash
# skrypt pobiera najnowsze filmy

POBRANE="./pobrane2"                    # plik zapisem pobranych filmów
JSONFILE="./videos.json"                # plik z opisami w JSONie
JSONOUT="./v.json"              # plik z opisami w JSONie
YT=`which youtube-dl`
MAXVIDS=$2                              # ile najnowszych z danego odpalenia
DEFAULT_MAXVIDS=4                       # domyślna ilość filmów
MAXOLD=1day                             # ile dni wstecz
VIDEO=$1                                # url do kanału
VOD="."                                 # folder dla gotowych plików
MAXDURATION=4800                        # maksymalna długość filmu 1,5h
DEFAULT_VIDEO="https://www.youtube.com/channel/UCiwsDgj8mJnsGOr6oN-2OVQ/videos"         # url do kanału wRealu24

# upgrade
$YT -U
#youtube-dl --rm-cache-dir

# usuwam górne i dolne nawiasy
sed -i '1 s/\[//' $JSONFILE
sed -i '$ s/\]//' $JSONFILE

#       --format "worst" \

$YT \
        --quiet \
        --match-filter "duration &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; $MAXDURATION &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; !is_live" \
        --ignore-errors \
        --add-metadata \
        --format "best[height=480]/bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" \
        --download-archive $POBRANE \
        --playlist-end $DEFAULT_MAXVIDS \
        --write-thumbnail \
        --no-progress \
        --merge-output-format mp4 \
        --restrict-filenames \
        --exec './yt-convert2.sh {}' \
        -o "%(id)s.%(ext)s" \
        $DEFAULT_VIDEO

# kopiowanie miniaturek
echo -n -e "\e[31mPrzenoszę miniaturki do $VOD... \033[0m       "
mv -f *.webp $VOD 2&amp;gt; /dev/null
echo "gotowe."

# dopisuję co trzeba do $JSONFILE
echo -n -e "\e[31mTworzę plik: $JSONOUT... \033[0m      "
sed '$ s/.$//' $JSONFILE &amp;gt; $JSONOUT
sed -i '1i \[' $JSONOUT
echo "]" &amp;gt;&amp;gt; $JSONOUT
echo -e "gotowe."


# czyszczenie
echo -n -e "\e[31mKasuję zbędne pliki... \033[0m        "
cd /home/paczor
rm -f *.webp
rm -f *.jpg
rm -f *.jpeg
rm -f *.mp4
echo "gotowe."
&lt;/pre&gt;
&lt;p&gt;Konwersja filmów, miniaturek i wypluwanie JSON-a wygląda zaś tak:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/bash
# skrypt konwertuje video i generuje miniatury

JSONFILE="./videos.json"        # plik z opisami w JSONie
VOD="."                 # folder dla gotowych plików
FF=`which ffmpeg`
MINFO=`which mediainfo`                                 # mediainfo wyciąga datę utworzenia filmu
YT=`which youtube-dl`
PREFIX="https://youtu.be"                               # YT prefix
VODURL="https://vod.fubar.pl"                      # url gdzie leżą pliki video

mkfifo mypipe

# parsowanie JSONa
function parse {
         jq \
        --arg status public \
        --arg videoUrl "$VODURL/$1.mp4" \
        --arg thumbnail "$VODURL/$1.webp" \
        --arg seed "true" \
        --arg upload_date "$VIDEODATE" \
        '{id: .id,title: .title,uploadedAt: $upload_date,publishedAt: $upload_date,status: $status,videoUrl: $videoUrl,desc: .description,views: .view_count,likes: .like_count,tags: .tags[:3],thumbnailUrl: $thumbnail,duration: .duration,seed: $seed}'
}

VIDEODATE=$(exiftool  -t -time:FileModifyDate -- "$1" | cut -d" " -f2 | sed 's/+.*$//')
echo -e "\033[31mPrzetwarzam video: $PREFIX/$1\033[0m"
echo -e "\e[92m data emisji:\033[0m     $VIDEODATE"

echo -n -e "\e[92m      zapisuję metadata do: $JSONFILE ...\033[0m      "

$YT --skip-download -j "$PREFIX/$1" 2&amp;gt; mypipe | grep "ERR" mypipe
if [ $? -eq 1 ]; then
        $YT --skip-download -j "$PREFIX/$1" | parse "$1" &amp;gt;&amp;gt; $JSONFILE
        echo -n "," &amp;gt;&amp;gt; $JSONFILE
        echo "bez błędu"
else
        echo "błąd!"
fi

echo -n -e "\e[92m      skaluję do:     $VOD/$1 ... \033[0m     "
#$FF -i $1 -filter:v scale=-2:480 -threads 16 -hide_banner -loglevel error -y $VOD/$1
echo " gotowe."

echo -n -e "\e[92m      konwertuję miniaturkę... \033[0m"
if [[ -e `basename $1 .mp4`.jpg ]]; then
        THUMB=`basename $1 .mp4`.jpg
        convert $THUMB `basename $THUMB .jpg`.webp
        rm -f $THUMB
        echo "zmieniłem JPEG na WEBP."
else
        echo "WEBP już istnieje."
fi

rm mypipe
&lt;/pre&gt;
&lt;p&gt;Miałem z tym sporo grzebania, zgłosiłem dwa błędy które wykryłem w youtube-dl oraz w programie Mediainfo. Pisanie skryptów w Bashu coraz mniej mnie cieszy, nie lubię jego składni, podstawień, itp.&lt;/p&gt;
</content><category term="Hack"></category><category term="linux"></category><category term="skrypt"></category><category term="wolność"></category><category term="youtube"></category></entry><entry><title>Zjednywanie +</title><link href="https://scyzoryk.fubar.pl/zjednywanie.html" rel="alternate"></link><published>2021-04-21T08:47:00+02:00</published><updated>2021-04-21T08:47:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-04-21:/zjednywanie.html</id><summary type="html">&lt;p&gt;Świetny film, z głównej sekwencji można wyciągnąć wnioski dające się przełożyć na rzeczywistość, cytat:&lt;/p&gt;
&lt;p&gt;"Aby wyniszczyć, trzeba najpierw wybrać metodę. Przede wszystkim należy rozważyć czy truć od razu, czy najpierw je zjednać, przynęcić, zwabić. Ostra dawka trucizny daje efekt natychmiastowy, ale niszczy mniej więcej trzy czwarte populacji. Reszta ostrzeżona, uchodzi …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Świetny film, z głównej sekwencji można wyciągnąć wnioski dające się przełożyć na rzeczywistość, cytat:&lt;/p&gt;
&lt;p&gt;"Aby wyniszczyć, trzeba najpierw wybrać metodę. Przede wszystkim należy rozważyć czy truć od razu, czy najpierw je zjednać, przynęcić, zwabić. Ostra dawka trucizny daje efekt natychmiastowy, ale niszczy mniej więcej trzy czwarte populacji. Reszta ostrzeżona, uchodzi cało. Co więcej - przekaże swoje doświadczenia następnym pokoleniom. Stąd wniosek, że najpierw zjednywać.Â&lt;/p&gt;
&lt;p&gt;Najważniejsze jest aby ich nie zrazić do siebie i trzeba najpierw zdobyć ich zaufanie. Zaufanie zdobywa się poprzez dokarmianie. Jak już zaufają to nie myślą wtedy i można łatwo z nimi porządek zrobić wtedy.Â&lt;/p&gt;
&lt;p&gt;Tak mi ufają, że leżą trupy obok, zdychają, a następne ciągle jedzą. Zaufały do końca i nie przyjdzie im do głowy, że ja mogłem je oszukać, zdradzić. W ten sposób wyniszczam 80-90% populacji."&lt;/p&gt;
&lt;video autoplay="" controls="" loop="" src="/uploads/2021/04/Szczurolap-1986.mp4"&gt;&lt;/video&gt;</content><category term="Wypociny"></category></entry><entry><title>Dell R510 jako serwer backupowy</title><link href="https://scyzoryk.fubar.pl/dell_r510_jako_serwer_backupowy.html" rel="alternate"></link><published>2021-03-30T22:00:00+02:00</published><updated>2021-03-30T22:00:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-03-30:/dell_r510_jako_serwer_backupowy.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ten akurat model, który mam szczęście rewitalizować ma kontroler RAID PERC H700. Kontroler ma tę zaletę, że bez problemu "widzi" 10TB dyski ale ma też tę wadę, że nie posiada wsparcia dla JBOD. A to oznacza, że możemy zapomnieć o stawianiu na nim …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ten akurat model, który mam szczęście rewitalizować ma kontroler RAID PERC H700. Kontroler ma tę zaletę, że bez problemu "widzi" 10TB dyski ale ma też tę wadę, że nie posiada wsparcia dla JBOD. A to oznacza, że możemy zapomnieć o stawianiu na nim takich systemów NAS-owych jak FreeNAS i w szystkich tych, które opierają się na ZFS-ie.&lt;/p&gt;
&lt;p&gt;Wybrałem inne podejście - zainstalowanie Debiana na pendrive USB, a macierz będzie hardware'owa. Do wykonania jest istalacja usługi, która będzie mnie informowała o ewentualnych problemach z macierzą.&lt;/p&gt;
&lt;p&gt;Już na wstępie pojawiły się problemy z brakiem obsługi kart sieciowych. To dlatego, że w oficjalnym obrazie, z którego robiłem penbootkę, nie ma firmware'u dla tych kart bo... jest on "komercyjny". Rozwiazanie jest bardzo proste, należy wyłączyć serwer i na pendrive z zainstalowanym Debianem wgrać firmware pobrany z:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://packages.debian.org/buster/all/firmware-bnx2/download"&gt;https://packages.debian.org/buster/all/firmware-bnx2/download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ponownie odpalić system z pendrive'a i za pomocą dpkg zainstalować pobraną paczkę:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;dpkg&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;firmware-bnx2_20190114-2_all.deb
&lt;/pre&gt;
&lt;p&gt;Restart i karty pracują.&lt;/p&gt;
&lt;p&gt;Kolej na pobieranie informacji o stanie kontrolera PERC. Ciekawe czy nie przydadzą się moje doświadczenia ze maciorą i prosiakami?&lt;/p&gt;
</content><category term="Shitz"></category></entry><entry><title>Domyślne aplikacje - Linux</title><link href="https://scyzoryk.fubar.pl/domyslne-aplikacje-linux.html" rel="alternate"></link><published>2021-03-28T09:15:00+02:00</published><updated>2021-03-28T09:15:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-03-28:/domyslne-aplikacje-linux.html</id><summary type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Zrobiłem na szybko skrypt do ustawiania domyślnych aplikacji dla różnych typów MIME. Zaczęło się od ustawiania domyślnego programu dla plików PDF w Alpine. Instalacja &lt;a class="reference external" href="https://xournalpp.github.io/"&gt;Xournall++&lt;/a&gt; (genialny edytor) popsuła mi to co miałem czyli Zathurę. Okazało się i tak, że Alpine korzysta z plików ~/.mailcap albo /etc/mailcap, ale już jakoś …&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Zrobiłem na szybko skrypt do ustawiania domyślnych aplikacji dla różnych typów MIME. Zaczęło się od ustawiania domyślnego programu dla plików PDF w Alpine. Instalacja &lt;a class="reference external" href="https://xournalpp.github.io/"&gt;Xournall++&lt;/a&gt; (genialny edytor) popsuła mi to co miałem czyli Zathurę. Okazało się i tak, że Alpine korzysta z plików ~/.mailcap albo /etc/mailcap, ale już jakoś poleciało. Nie lubię freedesktop i mam to gdzieś. Musiałem to napisać.&lt;/div&gt;
&lt;div class="line"&gt;Skryptu nie mam zamiaru rozwijać, kropka. Przy użyciu warto rzucić uwagę na folder przeszukiwania, tu jest tylko &lt;strong&gt;/usr/share/applications&lt;/strong&gt;, a pliki .desktop lubią być porozrzucane. Co za śmietnik! Potrzebne &lt;a class="reference external" href="https://github.com/davatorium/rofi"&gt;rofi&lt;/a&gt;, reszta systemowa.&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/sh

XDGMIME=`which xdg-mime`
FILETYPE=$($XDGMIME query filetype "$1")
APP=$( find /usr/share/applications -name '*.desktop' -exec grep -l "MimeType=$FILETYPE" {} \; | sed -e 's/^.*\///' -e 's/\.desktop//' | rofi \
        -dmenu -i \
        -p "Wybierz domyślną aplikację dla typu: $FILETYPE" \
        -no-fixed-num-lines \
        -width 80 \
        -font "Inconsolata 12" \
        -hide-scrollbar \
        )
$XDGMIME default "$APP.desktop" "$FILETYPE"
echo "$APP ustawiona jako domyślna aplikacja otwierająca $FILETYPE"
&lt;/pre&gt;
</content><category term="Tips4Unices"></category><category term="systemy"></category><category term="programowanie"></category><category term="bezpieczeństwo"></category></entry><entry><title>Diorama płonącej serwerowni OVH</title><link href="https://scyzoryk.fubar.pl/diorama_plonacej_serwerowni_ovh.html" rel="alternate"></link><published>2021-03-23T00:55:00+01:00</published><updated>2021-03-23T00:55:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-03-23:/diorama_plonacej_serwerowni_ovh.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tytuł jest durny ale oddaje to co udało mi się zrobić.&lt;/p&gt;
&lt;p&gt;Zaczęło się od tego, że kupiłem nowy serwer: Actina z procesorem AMD Epyc. Sprzęt fajny, cenowo dużo lepszy niż Delle albo HaPeki. Wszystko mający ale z jedną, powiedzmy wadą: bardzo głośny!&lt;/p&gt;
&lt;p&gt;W …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tytuł jest durny ale oddaje to co udało mi się zrobić.&lt;/p&gt;
&lt;p&gt;Zaczęło się od tego, że kupiłem nowy serwer: Actina z procesorem AMD Epyc. Sprzęt fajny, cenowo dużo lepszy niż Delle albo HaPeki. Wszystko mający ale z jedną, powiedzmy wadą: bardzo głośny!&lt;/p&gt;
&lt;p&gt;W serwerowni szum jego wiatraków włączyłby się w ogólny chór i nie byłoby sprawy ale ten sprzęt znajduje się w szafie stojącej w pokoju gdzie pracują księgowe. Nawet gdy nie jest mocno obciążony, po prostu wyje nie do wytrzymania. Ktoś kto pisał firmware przy wiatrakach przesadził z ustawieniem dolnej granicy obrotów, co jestem w stanie udowodnić więc do rzeczy.&lt;/p&gt;
&lt;p&gt;"Skręcenie" obrotów wiatraka za pomocą ustawień BMC nic nie dało, musiałem znaleźć alternatywne rozwiązanie. Ktoś doradzał zmiejszenie napięcia i nawet początkowo poszedłem w tę stronę, dziś już nie pamiętam dlaczego porzuciłem to rozwiązanie - zdaje się, że wentylatory pracowały nierówno. W końcu wyczytałem, że&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.hackster.io/Buechner/4-wired-fan-control-pwm-bb29ac"&gt;https://www.hackster.io/Buechner/4-wired-fan-control-pwm-bb29ac&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://starter-kit.nettigo.pl/2012/01/co-to-jest-pwm/"&gt;https://starter-kit.nettigo.pl/2012/01/co-to-jest-pwm/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://pavouk.org/hw/fan/en_fan4wire.html"&gt;http://pavouk.org/hw/fan/en_fan4wire.html&lt;/a&gt;&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/bin/bash

read -d '\n' -r -a core_temp_arr &lt;span class="err"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; $(sensors  | grep 'Tctl:' | sed -e 's/^Tctl: *//;s/+//;s/Â°C//')
total_cpu_temp=0
index=0
for i in "${core_temp_arr[@]}"; do :
    temp=$(echo $i | sed -n 's/Â°C.*//; s/.*[+-]//; p; q')
    let index++
    total_cpu_temp=$(echo "$total_cpu_temp + $temp" | bc)
done
avg_cpu_temp=$(echo "scale=2; $total_cpu_temp / $index" | bc)
echo $avg_cpu_temp
exit 0
&lt;/pre&gt;
&lt;p&gt;stty -F /dev/ttyUSB0 9600 -parity cs8 -cstopb&lt;/p&gt;
&lt;p&gt;OR&lt;/p&gt;
&lt;p&gt;stty -speed 9600 &amp;lt; /dev/ttyUSB0&lt;/p&gt;
&lt;p&gt;Now Send data:&lt;/p&gt;
&lt;p&gt;echo "cmd" &amp;gt; /dev/ttyUSB0&lt;/p&gt;
</content><category term="hack"></category></entry><entry><title>VIM: usuwanie złych cudzysłowów</title><link href="https://scyzoryk.fubar.pl/vim-usuwanie-zlych-cudzyslowow.html" rel="alternate"></link><published>2021-03-14T08:50:00+01:00</published><updated>2021-03-14T08:50:00+01:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2021-03-14:/vim-usuwanie-zlych-cudzyslowow.html</id><summary type="html">&lt;p&gt;Bardzo często w skryptach kopiowanych ze stron internetowych pojawiają się nieprawidłowe cudzysłowy czyli takie &lt;strong&gt;â€œâ€?&lt;/strong&gt;. Dla tekstów pisanych są one jak najbardziej prawidłowe ale skrypty są nudne, nie dopuszczają artystycznej swobody, więc trzeba je zmienić na parę "", czyli na jeden i ten sam cudzysłów.&lt;/p&gt;
&lt;p&gt;Sęk w tym jednak, żeby …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bardzo często w skryptach kopiowanych ze stron internetowych pojawiają się nieprawidłowe cudzysłowy czyli takie &lt;strong&gt;â€œâ€?&lt;/strong&gt;. Dla tekstów pisanych są one jak najbardziej prawidłowe ale skrypty są nudne, nie dopuszczają artystycznej swobody, więc trzeba je zmienić na parę "", czyli na jeden i ten sam cudzysłów.&lt;/p&gt;
&lt;p&gt;Sęk w tym jednak, żeby taki znak skopiować i wkleić w linię komend VIM-a. A jest na to bardzo prosty sposób:&lt;/p&gt;
&lt;p&gt;"najeżdżamy" na zły znak, naciskamy &lt;strong&gt;v&lt;/strong&gt;, potem &lt;strong&gt;y&lt;/strong&gt; i &lt;strong&gt;ESC&lt;/strong&gt;. W ten sposób znak znalazł się już w schowku.&lt;/p&gt;
&lt;p&gt;Teraz używamy linii komend:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
:%s/&amp;lt;CTRL+r&amp;gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;/g
&lt;/pre&gt;
&lt;p&gt;naciśnięcie** CTRL** razem z &lt;strong&gt;r&lt;/strong&gt;, a potem znak cudzysłowu sprawi, że w linię koment zostanie wklejony znak ze schowka. Komenda zamieni wszystkie jego wystąpienia na prawidłowych cudzysłów.&lt;/p&gt;
</content><category term="Tips 4 VIM"></category><category term="vim"></category></entry><entry><title>EVE na Proxmoxie</title><link href="https://scyzoryk.fubar.pl/eve-na-proxmoxie.html" rel="alternate"></link><published>2021-02-17T19:14:00+01:00</published><updated>2021-02-17T19:14:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-02-17:/eve-na-proxmoxie.html</id><summary type="html">&lt;p&gt;Środowisko &lt;a class="reference external" href="https://www.eve-ng.net/i"&gt;EVE&lt;/a&gt;, bo emulowane laboratorium do testowania konfiguracji sieci należy nazwać środowiskiem, to podobno niezłe narzędzie. Nie wiem, jeszcze nie dotykałem, używałem &lt;a class="reference external" href="http://www.gns3.com/"&gt;GNS3&lt;/a&gt; i odrobinę ciscowego PacketTracera. Pora spróbować wersji darmowej...&lt;/p&gt;
&lt;p&gt;Instalacja &lt;a class="reference external" href="https://www.eve-ng.net/i"&gt;EVE&lt;/a&gt; na Proxmoxie z pobranej konfiguracji VMWare nie udała mi się. Po skonwertowaniu maszyny:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
qm&lt;span class="w"&gt; &lt;/span&gt;importovf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;111&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./EVE-COMM-VM …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;Środowisko &lt;a class="reference external" href="https://www.eve-ng.net/i"&gt;EVE&lt;/a&gt;, bo emulowane laboratorium do testowania konfiguracji sieci należy nazwać środowiskiem, to podobno niezłe narzędzie. Nie wiem, jeszcze nie dotykałem, używałem &lt;a class="reference external" href="http://www.gns3.com/"&gt;GNS3&lt;/a&gt; i odrobinę ciscowego PacketTracera. Pora spróbować wersji darmowej...&lt;/p&gt;
&lt;p&gt;Instalacja &lt;a class="reference external" href="https://www.eve-ng.net/i"&gt;EVE&lt;/a&gt; na Proxmoxie z pobranej konfiguracji VMWare nie udała mi się. Po skonwertowaniu maszyny:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
qm&lt;span class="w"&gt; &lt;/span&gt;importovf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;111&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./EVE-COMM-VM.ovf&lt;span class="w"&gt; &lt;/span&gt;local-lvm
&lt;/pre&gt;
&lt;p&gt;Maszynka odpala się wyłącznie w trybie single. Próbowałem różnych ustawień ale guzik.&lt;/p&gt;
&lt;p&gt;Zainstalowałem jako VM pliku ISO.&lt;/p&gt;
&lt;p&gt;Ważne ustawienia:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;8GB RAM&lt;/p&gt;
&lt;p&gt;1 socket i 4 rdzenie na CPU (nie testowałem innych opcji)&lt;/p&gt;
&lt;p&gt;karta grafiki "VMware compatible"&lt;/p&gt;
&lt;p&gt;dysk conajmniej 50GB&lt;/p&gt;
&lt;p&gt;włączenie tzw. "Nested Hardware-assisted Virtualization"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Włączenie ostatniej z powyższych opcji opisane jest tu:&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://pve.proxmox.com/wiki/Nested_Virtualization"&gt;https://pve.proxmox.com/wiki/Nested_Virtualization&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;W skrócie, na Proxmoxie należy wykonać to (wersja na Intelu):&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;/sys/module/kvm_intel/parameters/nested
&lt;/pre&gt;
&lt;p&gt;Jeśli pojawi się "N", to:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"options kvm-intel nested=Y"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/modprobe.d/kvm-intel.conf
&lt;/pre&gt;
&lt;p&gt;I przeładować moduł kernela, żeby nie restartować maszynki:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
modprobe&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;kvm_intel&lt;span class="w"&gt;
&lt;/span&gt;modprobe&lt;span class="w"&gt; &lt;/span&gt;kvm_intel
&lt;/pre&gt;
&lt;p&gt;EVE ładuje się bez problemu i można zacząć naukę.&lt;/p&gt;
</content><category term="Wirtualizacja"></category><category term="sieć"></category><category term="wirtualizacja"></category><category term="proxmox"></category></entry><entry><title>Ojciec wie lepiej...</title><link href="https://scyzoryk.fubar.pl/ojciec-wie-lepiej.html" rel="alternate"></link><published>2021-02-13T10:20:00+01:00</published><updated>2021-02-13T10:20:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-02-13:/ojciec-wie-lepiej.html</id><summary type="html">&lt;p&gt;...kiedy odciąć pewnego rodzaju, internetową aktywność swych dzieci. Koniec, kropka.&lt;/p&gt;
&lt;p&gt;Nadeszła właśnie TA chwila, a że nie zanosi się na szybki powrót do szkoły, zaś po wielu rozmowach i ustaleniach NIC się nie zmienia, więc od PERSWAZJI czas przejść do PREWENCJI.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://pi-hole.net/"&gt;Pi-hole&lt;/a&gt; to oprogramowanie, które jest pośrednikiem pomiędzy serwerem DNS …&lt;/p&gt;</summary><content type="html">&lt;p&gt;...kiedy odciąć pewnego rodzaju, internetową aktywność swych dzieci. Koniec, kropka.&lt;/p&gt;
&lt;p&gt;Nadeszła właśnie TA chwila, a że nie zanosi się na szybki powrót do szkoły, zaś po wielu rozmowach i ustaleniach NIC się nie zmienia, więc od PERSWAZJI czas przejść do PREWENCJI.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://pi-hole.net/"&gt;Pi-hole&lt;/a&gt; to oprogramowanie, które jest pośrednikiem pomiędzy serwerem DNS, a naszą, domową siecią. Na podstawie samodzielnie stworzonych białych i czarnych list decyduje czy dać dostęp do danej strony www czy też dostępu odmówić. Tej właściwości, domowy oczywiście, postanowiłem użyć we własnym domu.&lt;/p&gt;
&lt;p&gt;Na RaspberryPi postawiłem kontener &lt;a class="reference external" href="https://pi-hole.net/"&gt;Pi-hole&lt;/a&gt; , robi się to naprawdę w 2 minuty (włącznie z pobraniem obrazu). Na Malince używam &lt;a class="reference external" href="https://blog.hypriot.com/"&gt;HyperiotOS&lt;/a&gt; więc mam na niej Dockera. Tworzę plik docker-compose.yml z następującą zawartością:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
version: "3"

# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "67:67/udp"
      - "80:80/tcp"
      - "443:443/tcp"
    environment:
      TZ: 'Europe/Warsaw'
      # WEBPASSWORD: 'set a secure password here or it will be random'
    # Volumes store your data between container upgrades
    volumes:
      - './etc-pihole/:/etc/pihole/'
      - './etc-dnsmasq.d/:/etc/dnsmasq.d/'
    # Recommended but not required (DHCP needs NET_ADMIN)
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    cap_add:
      - NET_ADMIN
    restart: unless-stopped
&lt;/pre&gt;
&lt;p&gt;Do ustawienia są 2 linijki, ta ze strefą czasową, oraz następna gdzie można ustawić stałe hasło do interfejsu www.&lt;/p&gt;
&lt;p&gt;Po zapisaniu pliku opdaliłem komendę:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
docker-compose&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt; &lt;/span&gt;--detach
&lt;/pre&gt;
&lt;p&gt;Uwaga! Należy sprawdzić czy na tym samym hoście jakiś serwis już nie blokuje portów: 53, 67, 80 i 443.&lt;/p&gt;
&lt;p&gt;No i już! Na Malince działa Pi-hole!&lt;/p&gt;
&lt;p&gt;Aby to sprawdzić, wystarczy w przeglądarce wejść pod adres &lt;a class="reference external" href="http://IP-MALINKI/admin/"&gt;http://IP-MALINKI/admin/&lt;/a&gt;, gdzie IP-MALINKI to adres IP RaspberryPi na którym zainstalowane jest Pi-hole.&lt;/p&gt;
&lt;p&gt;Nie będę opisywał tu szczegołów posługiwania się Pi-hole, wystarczy poczytać dokumentację, ale tak na szybko dodam:&lt;/p&gt;
&lt;p&gt;najciekawsze było dla mnie samo blokowanie niepożądanych stron www. Można skorzystać z dziesiątków istniejących blacklist ale jeszcze fajniejsza była próba, której efekt uzyskałem niemal natychmiast.&lt;/p&gt;
&lt;p&gt;W interfejsie Pi-hole włazłem w sekcję Blacklist (w menu po lewej):&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="/uploads/2021/02/2021-02-13-084417_2504x1518_scrot.png"&gt;&lt;img alt="image1" src="/uploads/2021/02/2021-02-13-084417_2504x1518_scrot.png" style="width: 600px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;wpisałem "youtube.com", zaznaczyłem opcję &lt;strong&gt;"Add domain as wildcard"&lt;/strong&gt; i kliknąłem "Add to Blacklist". Spróbowałem wejść na youtube.com i... wszedłem! Kicha! Nie działa!&lt;/p&gt;
&lt;p&gt;No, nie. Tak głupi nie jestem. Pewnie, że nie zadziała. Ale dlaczego?&lt;/p&gt;
&lt;p&gt;Każdy komputer, ten w domowej sieci, ma przypisany numer IP. Może mieć ustawiony na stałe, może też mieć pobierany automatcznie z serwera DHCP. Wraz z tym numerem ma też, a raczej powinien mieć ustawiony adres serwera DNS. Może nie mieć, ale wtedy wszędzie trzeba wchodzić po numerze IP. Kto to spamięta? &lt;em&gt;(można sobie zrobić plik hosts - ktoś doda)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Co stało gdy wszedłem na stronę youtube.com? Moja przeglądarka wysłała, po cichu, zapytanie do serwera DNS: jaki adres IP ma youtube.com? Serwer DNS jej odpowiedział, że taki a taki i przeglądarka połaczyła się z serwerem youtube.&lt;/p&gt;
&lt;p&gt;Skoro Pi-hole jest pośrednikiem pomiędzy serwerem DNS to powinien się pojawić w powyższym opisie, powinien ale go nie ma. Dlaczego? Dlatego, że jeszcze czegoś zabrakło w powyższym opisie.&lt;/p&gt;
&lt;p&gt;Przeglądarka zna adres IP serwera DNS ale komunikuje się z nim poprzez bramę na świat jaką w każdym domu jest router. Tak, to małe pudełko które zostawiają instalatorzy Orange, Netii czy innego tzw. providera. Router przesyła dalej zapytanie z przeglądarki, a to oznacza że to właśnie jego trzeba zmusić by każde zapytanie DNS najpierw przesyłał przez pośrednika jakim jest Pi-hole.&lt;/p&gt;
&lt;p&gt;Mój router to Mikrotik i żeby przechwytywać każde zapytanie DNS muszę do jego konfiguracji dopisać dwie dyrektywy, w moim przypadku wyglądają tak:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
/ip&lt;span class="w"&gt; &lt;/span&gt;firewall&lt;span class="w"&gt; &lt;/span&gt;nat&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dstnat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dst-nat&lt;span class="w"&gt; &lt;/span&gt;to-addresses&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;udp&lt;span class="w"&gt; &lt;/span&gt;src-address&lt;span class="o"&gt;=&lt;/span&gt;!192.168.1.3&lt;span class="w"&gt; &lt;/span&gt;dst-address&lt;span class="o"&gt;=&lt;/span&gt;!192.168.1.3&lt;span class="w"&gt; &lt;/span&gt;dst-port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;-interface&lt;span class="o"&gt;=&lt;/span&gt;bridge&lt;span class="w"&gt;

&lt;/span&gt;/ip&lt;span class="w"&gt; &lt;/span&gt;firewall&lt;span class="w"&gt; &lt;/span&gt;nat&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;chain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;srcnat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;masquerade&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;udp&lt;span class="w"&gt; &lt;/span&gt;src-address&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.0/24&lt;span class="w"&gt; &lt;/span&gt;dst-address&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.3&lt;span class="w"&gt; &lt;/span&gt;dst-port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;53&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Adres 192.168.1.3 to adres Malinki z Pi-holem.&lt;/p&gt;
&lt;p&gt;W skrócie: cokolwiek przyjdzie do routera z sieci wewnętrznej i jest zapytaniem DNS, przekieruj to zapytanie na adres 192.168.1.3, a resztą zajmie się Pi-hole.&lt;/p&gt;
&lt;p&gt;Proces jeszcze się nie zakończył, teraz dopiero zaczęła się ciężka harówa - trzeba całość dopieścić tak, żeby technologia pomagała, a nie przeszkadzała. Uczyła, a nie deprawowała.&lt;/p&gt;
&lt;p&gt;dePRAWOwać, pasuje mi to słowo, oznacza likwidację naturalnych praw człowieka, a prawa to obowiązki. Człowiek zdeprawowany jest zlewicowany, nieodpowiedzialny i samolubny.&lt;/p&gt;
&lt;p&gt;I tym filozoficznym akcentem kończę ten radosny wpis.&lt;/p&gt;
</content><category term="Automatyczny dom"></category><category term="komunikacja"></category><category term="administracja"></category><category term="sieć"></category><category term="systemy"></category></entry><entry><title>Debian na Macbooku Pro Late 2013 (11,3)</title><link href="https://scyzoryk.fubar.pl/debian-na-macbooku-pro-late-2013-113.html" rel="alternate"></link><published>2021-02-08T00:38:00+01:00</published><updated>2021-02-08T00:38:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-02-08:/debian-na-macbooku-pro-late-2013-113.html</id><summary type="html">&lt;p&gt;Mam nadzieję, że tytuł mówi o czym jest ten artykuł, do rzeczy więcâ€¦&lt;/p&gt;
&lt;p&gt;Poniższe słowa powstały ponad rok temu i przeleżały wszystkie te miesiące w postaci szkicu, uzupełnianego o nowe pozycje. Wiele się w tym czasie zmieniło więc znajduje się tu mieszanina różnych wersji jądra i samego systemu. Na początku …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mam nadzieję, że tytuł mówi o czym jest ten artykuł, do rzeczy więcâ€¦&lt;/p&gt;
&lt;p&gt;Poniższe słowa powstały ponad rok temu i przeleżały wszystkie te miesiące w postaci szkicu, uzupełnianego o nowe pozycje. Wiele się w tym czasie zmieniło więc znajduje się tu mieszanina różnych wersji jądra i samego systemu. Na początku był Jessie, a teraz jest Buster. Wiele problemów rozwiązały kolejne edycje kernela - po prostu pojawiały się nowe sterowniki.&lt;/p&gt;
&lt;p&gt;Dziś, czyli w połowie lutego 2021 roku, po ponad roku niby pandemii, nie działa klawiatura, jest problem z USB i HDMI - ewidentnie Macbook dożywa już ostatnich dni.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Z perspektywy ponad 1,5 roku pracy pod Linuksem mogę szczerze powiedzieć, że Macbook to &lt;strong&gt;sprzętowa tragedia&lt;/strong&gt; i &lt;strong&gt;odradzam jego zakup jeśli nie ma się zamiaru używać wyłącznie macOSa&lt;/strong&gt;.&lt;/div&gt;
&lt;div class="line"&gt;Implementacja USB to porażka, nigdy dobrze nie działało, w poprzednich modelach też miałem z problem z tymi portami. Aluminiowe obudowy są wrażliwe na nacisk dłoni, mój pierwszy Macbook lekko mnie kopał kiedy dotykałem innego sprzętu pod napięciem, oba miały problemy z klawiaturą jeśli oparłem zbyt mocno lewą rękę.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;MacOS za to stał się fatalnym systemem, piszę â€žstał sięâ€? bo jeszcze parę wydań temu był mi miły ale ostatnie aktualizacje sprawiały, że coraz bardziej czułem się osaczony kolejnymi â€žochronamiâ€? i â€žudogodnieniamiâ€?.&lt;/p&gt;
&lt;p&gt;Wracając do artykułu, nowości pojawiały się tu w miarę jak dostrajałem Macbooka do swoich skromnych potrzeb, a były to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pozbycie się macOS, z powodów które już wyjaśniłem,&lt;/li&gt;
&lt;li&gt;działające X-y z możliwością przełączenia na konsolę (to się nie udało i raczej już nie uda),&lt;/li&gt;
&lt;li&gt;Xmonad jako Window Manager, xmobar jako centrum informacyjne,&lt;/li&gt;
&lt;li&gt;działające specjalne funkcje (regulacja podświetlenia klawiatury, monitora, regulacja dźwięku, itd.),&lt;/li&gt;
&lt;li&gt;trackpad działający równie gładko jak w macOS (udało się połowicznie),&lt;/li&gt;
&lt;li&gt;działające WiFi,&lt;/li&gt;
&lt;li&gt;działająca hibernacja&lt;/li&gt;
&lt;li&gt;drobne usprawnienia softwarowe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instalację wykonałem podobnie jak w opisie z (&lt;a class="reference external" href="https://blog.jessfraz.com/post/linux-on-mac/"&gt;https://blog.jessfraz.com/post/linux-on-mac/&lt;/a&gt;), tzn. że również mam refinda jako boot managera, trochę tylko podkoloryzowanego, żeby robić wrażenie i udawać hakiera.&lt;/p&gt;
&lt;p&gt;Pierwotnie zainstalowałem kernel 3.18.36. Włączyłem obsługę Thunderbolta. Kartę Ethernet mam na USB i działa z difoltu więc bez kłopotów mogłem od razu uaktualniać i instalować software. Przeboje z wbudowaną kartą WiFi zostawiłem ale są już passe.&lt;/p&gt;
&lt;div class="section" id="refind"&gt;
&lt;h2&gt;reFind&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/0xbb/apple_set_os.efi"&gt;https://github.com/0xbb/apple_set_os.efi&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="terminal"&gt;
&lt;h2&gt;Terminal&lt;/h2&gt;
&lt;p&gt;Zmieniłem fonty  w konsoli na czytelne. Można jednorazowo:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;setfont &lt;span class="pre"&gt;/usr/share/consolefonts/Lat7-Terminus28x14.psf&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;lub na stałe:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dpkg-reconfigure&lt;/span&gt; &lt;span class="pre"&gt;-plow&lt;/span&gt; &lt;span class="pre"&gt;console-setup&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Kolory w konsoli ustawiłem wg tego linku: &lt;a class="reference external" href="http://user.it.uu.se/~embe8573/cols/www/index.html"&gt;http://user.it.uu.se/~embe8573/cols/www/index.html&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="xorg"&gt;
&lt;h2&gt;Xorg&lt;/h2&gt;
&lt;div class="section" id="nvidia"&gt;
&lt;h3&gt;Nvidia&lt;/h3&gt;
&lt;p&gt;Możesz to czytać dla sportu, a dla niecierpliwych: skocz do następnego punktu.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Xorg działało od razu na driverze nouveau czyli opensourceâ€™owym sterowniku dla Nvidii.&lt;/div&gt;
&lt;div class="line"&gt;Zachciało mi się jednak oryginalnego sterownika. Mimo wielu prób nie kompilowały mi się moduły jądra. Podczas kompilacji wyskakiwał błąd, że brak jest pliku include/generated/autoconf.h, chociaż plik jak najbardziej był na właściwym miejscu.&lt;/div&gt;
&lt;div class="line"&gt;Nie chciało mi się kopać z koniem, inni też się wymęczyli, więc użyłem repozytorium jessie-backports (wg.: &lt;a class="reference external" href="https://wiki.debian.org/NvidiaGraphicsDrivers#jessie-352"&gt;https://wiki.debian.org/NvidiaGraphicsDrivers#jessie-352&lt;/a&gt;):&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;do /etc/apt/sources.list dodałem:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
deb&lt;span class="w"&gt; &lt;/span&gt;http://httpredir.debian.org/debian&lt;span class="w"&gt; &lt;/span&gt;jessie-backports&lt;span class="w"&gt; &lt;/span&gt;main&lt;span class="w"&gt; &lt;/span&gt;contrib&lt;span class="w"&gt; &lt;/span&gt;non-free&lt;span class="w"&gt;
&lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt;
&lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;jessie-backports&lt;span class="w"&gt; &lt;/span&gt;nvidia-driver
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Trzeba usunąć /etc/X11/xorg.conf, bez niego server X używa domyślnych ustawień i działa prawidłowo.&lt;/div&gt;
&lt;div class="line"&gt;Na konfigurację przyjdzie jeszcze czasâ€¦&lt;/div&gt;
&lt;div class="line"&gt;Przerzuciłem się na zamknięty sterownik od NVidii (ten z .run na końcu). Jest OK ale nadal nie działa przechodzenie między X-ami, a konsolą. Podobno ten trick załatwia sprawę:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Aktualizacja:&lt;/em&gt; niestety, to nie działa.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="przelaczenie-na-zintegrowana-karte-intel"&gt;
&lt;h3&gt;Przełączenie na zintegrowaną kartę Intel:&lt;/h3&gt;
&lt;p&gt;Dlaczego w ogóle warto zawracać sobie tym głowę?&lt;/p&gt;
&lt;p&gt;Po pierwsze, gdy używam opesourceâ€™owego sterownika do kart Nvidii - Nouveau - nie działa hibernacja. A właściwie działa ale po wyjściu z zamrożenia użycie procesora skacze do ponad 90%, kernel zaś pluje taką ilością ostrzeżeń, że po kilku minutach syslog może spuchnąć do wielu gigabajtów.&lt;/p&gt;
&lt;p&gt;Po drugie, po przejściu na komercyjne sterowniki Nvidii traci się możliwość przejścia z X-ów do konsoli, ekran robi się czarny iâ€¦ koniec. Trzeba restartować system na ślepo.&lt;/p&gt;
&lt;p&gt;Po trzecie, Nvidia na komercyjnych sterownikach żre mnóstwo prądu, skracając czas działania na baterii.&lt;/p&gt;
&lt;p&gt;Jak to zrobić?&lt;/p&gt;
&lt;p&gt;W pliku /boot/efi/EFI/refind/refind.conf dodaj linię:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
spoof_osx_version 10.9
&lt;/pre&gt;
&lt;p&gt;która sprawia, że Macbook â€žmyśliâ€?, że bootuje w macOS-ie.&lt;/p&gt;
&lt;p&gt;Pobierz gpu-switch ze strony: &lt;a class="reference external" href="https://github.com/0xbb/gpu-switch"&gt;https://github.com/0xbb/gpu-switch&lt;/a&gt;. Użyj go z przełącznikiem â€ž-iâ€?:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
gpu-switch -i
&lt;/pre&gt;
&lt;p&gt;Spowoduje to przełączenie na kartę Intela. Teraz reboot.&lt;/p&gt;
&lt;p&gt;Zainstaluj pakiet: xserver-xorg-video-intel i gotowe.&lt;/p&gt;
&lt;p&gt;A teraz jazda bez trzymanki czyi próba wyłączenia Nvidii, mnie się nie udaje, mam błędy kernela i kończy się kompletnym zwisem. Lecz jeśli jej nie wyłączę to wszystko ładnie hasa.&lt;/p&gt;
&lt;p&gt;Działa i hibernacja i komputer nie żre prądu ale.. patrz gdzieś na koniec artykułu wpisu dotyczącego problemów z przerwaniami.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Opis i potrzebny kod są tu:&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/index.php/MacBookPro10,x#Graphics_2"&gt;https://wiki.archlinux.org/index.php/MacBookPro10,x#Graphics_2&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;oraz tu:&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/index.php/MacBookPro11,x#Graphics"&gt;https://wiki.archlinux.org/index.php/MacBookPro11,x#Graphics&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;i tu:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://gist.github.com/0xbb/974999591da4b1b2635c"&gt;https://gist.github.com/0xbb/974999591da4b1b2635c&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="hidpi"&gt;
&lt;h3&gt;HiDPI&lt;/h3&gt;
&lt;p&gt;Mój Macbook to model 11,3 czyli posiada gęsty ekran o nazwie Retina. Pod poniższym linkiem jest genialny poradnik co włączyć, żeby tekst na taki ekranie był czytelny. Chyba jedyne co nie zadziałało, to programy napisane w Tkinterze.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/index.php/HiDPI"&gt;https://wiki.archlinux.org/index.php/HiDPI&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="przejscie-na-display-managera-sddm"&gt;
&lt;h3&gt;Przejście na Display Managera: sddm&lt;/h3&gt;
&lt;pre class="code bash literal-block"&gt;
dpkg-reconfigure&lt;span class="w"&gt; &lt;/span&gt;sddm
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Własny temat ustawia się tak:&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://jlk.fjfi.cvut.cz/arch/manpages/man/sddm.conf.5"&gt;https://jlk.fjfi.cvut.cz/arch/manpages/man/sddm.conf.5&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;w /etc/sddm.conf dodać wpis:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="o"&gt;[&lt;/span&gt;Theme&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;Current&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debian-paczor&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;FacesDir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/paczor/Pictures/faces
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Tematy są w: /usr/share/sddm/themes/&lt;/div&gt;
&lt;div class="line"&gt;Skopiowałem debian-breeze jako debian-paczor i zmieniam konfigurację jak chcę.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ustawiam losową twarz skryptem ~/bin/change_face.sh:&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;#!/usr/bin/env bash&lt;/div&gt;
&lt;div class="line"&gt;FACE="face$(( ( RANDOM % 6 ) + 1 )).png"&lt;/div&gt;
&lt;div class="line"&gt;ln -f /home/paczor/Pictures/$FACE ~/.face.icon&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A wywołuję go z pliku ~/.zlogout (bo używam zsh).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="xscreensaver"&gt;
&lt;h3&gt;XSCREENSAVER&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Chcę, żeby startował automatycznie po zalogowaniu się do sesji X-ów.&lt;/div&gt;
&lt;div class="line"&gt;Tworzę katalog:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
mkdir ~/.config/systemd/user
&lt;/pre&gt;
&lt;p&gt;a w nim plik: xscreensaver.service z następującą zawartością:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="o"&gt;[&lt;/span&gt;Unit&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;XScreenSaver&lt;span class="w"&gt; &lt;/span&gt;Daemon&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;Service&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/xscreensaver&lt;span class="w"&gt; &lt;/span&gt;--no-splash&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;Install&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default.target
&lt;/pre&gt;
&lt;p&gt;Następnie włączam serwis:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl --user enable xscreensaver.service
&lt;/pre&gt;
&lt;p&gt;i uruchamiam:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl --user start xscreensaver.service
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="touchpad"&gt;
&lt;h3&gt;TOUCHPAD&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;W /etc/X11/xorg.conf.d dodałem dwa pliki, właściwie to pozostałość po poprzednich próbach i spokojnie można oba skonsolidować.&lt;/div&gt;
&lt;div class="line"&gt;W 50-synaptics-clickpad.conf:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code bash literal-block"&gt;
Section&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"InputClass"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Identifier&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"touchpad catchall"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Driver&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"synaptics"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;MatchIsTouchpad&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Option "VertScrollDelta" "-111"
# Option "HorizScrollDelta" "-111"
# Option "MinSpeed" "0.5"
# Option "MaxSpeed" "1.0"
# Option "AccelFactor" "0.075"
# Option "LBCornerButton" "8"
# browser "back" btn
# Option "RBCornerButton" "9"
# browser "forward" btn
&lt;/span&gt;EndSection
&lt;/pre&gt;
&lt;p&gt;a w 60-synaptics.conf:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
Section&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"InputClass"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Identifier&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"touchpad"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Driver&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"synaptics"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;MatchIsTouchpad&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;MatchDevicePath&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/dev/input/event*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FingerHigh"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"50"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TapButton1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TapButton2"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TapButton3"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RTCornerButton"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RBCornerButton"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LTCornerButton"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"LBCornerButton"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MinSpeed"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.7"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MaxSpeed"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.7"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SHMConfig"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TapAndDragGesture"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PalmDetect"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PalmMinWidth"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Option&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PalmMinz"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"200"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;EndSection
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Ostatnie 3 linijki mają ogromne znaczenie przy pisaniu na klawiaturze ponieważ â€žPalmDetectâ€? włącza wykrywanie przypadkowych dotknięć touchpadu przy pisaniu na klawiaturze. Pozostałe dwa to szerokość dotknięcia i siła nacisku.&lt;/div&gt;
&lt;div class="line"&gt;Ustawienia te można obserwować za pomocą narzędzia: evtest.&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
apt-get install evtest evetet /dev/input/event8
&lt;/pre&gt;
&lt;p&gt;(/dev/input8 to u mnie Touchpad)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="wifi"&gt;
&lt;h2&gt;WiFi&lt;/h2&gt;
&lt;pre class="code bash literal-block"&gt;
Ta&lt;span class="w"&gt; &lt;/span&gt;część&lt;span class="w"&gt; &lt;/span&gt;już&lt;span class="w"&gt; &lt;/span&gt;się&lt;span class="w"&gt; &lt;/span&gt;zdeaktualizowała,&lt;span class="w"&gt; &lt;/span&gt;sterownik&lt;span class="w"&gt; &lt;/span&gt;jest&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;nowym&lt;span class="w"&gt; &lt;/span&gt;kernelu.&lt;span class="w"&gt;
&lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;jessie-backports&lt;span class="w"&gt; &lt;/span&gt;broadcom-sta-dkms
&lt;/pre&gt;
&lt;p&gt;Ale nie kompiluje się sterownik do karty WiFi.&lt;/p&gt;
&lt;p&gt;:(pactl set-sink-mute 1 toggle&lt;/p&gt;
&lt;p&gt;Powrót do kernela 3.17.4.&lt;/p&gt;
&lt;p&gt;I od razu skasowanie nieudanego 3.18.36:&lt;/p&gt;
&lt;p&gt;ap-get purge -auto-remove linux-image-3.18.*&lt;/p&gt;
&lt;p&gt;Jeśli robiło się już:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;firmware-linux-nonfree&lt;span class="w"&gt; &lt;/span&gt;broadcom-sta-dkms&lt;span class="w"&gt;

&lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;ponowna&lt;span class="w"&gt; &lt;/span&gt;kompilacja&lt;span class="w"&gt; &lt;/span&gt;modułów&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kernela&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.17.4:&lt;span class="w"&gt;


&lt;/span&gt;dkms&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;broadcom-sta&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.30.223.248&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.17.4
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="klawiatura"&gt;
&lt;h2&gt;KLAWIATURA&lt;/h2&gt;
&lt;pre class="code bash literal-block"&gt;
Przełączenie&lt;span class="w"&gt; &lt;/span&gt;klawiszy&lt;span class="w"&gt; &lt;/span&gt;funkcyjnych&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;działanie&lt;span class="w"&gt; &lt;/span&gt;podobne&lt;span class="w"&gt; &lt;/span&gt;jak&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;macOS&lt;span class="w"&gt; &lt;/span&gt;czyli&lt;span class="w"&gt; &lt;/span&gt;tylko&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;wciśniętym&lt;span class="w"&gt; &lt;/span&gt;kalwiszem&lt;span class="w"&gt; &lt;/span&gt;Fn&lt;span class="w"&gt; &lt;/span&gt;funkcyjny&lt;span class="w"&gt; &lt;/span&gt;np.&lt;span class="w"&gt; &lt;/span&gt;F1&lt;span class="w"&gt; &lt;/span&gt;daje&lt;span class="w"&gt; &lt;/span&gt;dodatkową&lt;span class="w"&gt; &lt;/span&gt;funkcję,&lt;span class="w"&gt; &lt;/span&gt;np.&lt;span class="w"&gt; &lt;/span&gt;zmniejszenie&lt;span class="w"&gt; &lt;/span&gt;jasności&lt;span class="w"&gt; &lt;/span&gt;ekranu.&lt;span class="w"&gt;

&lt;/span&gt;Doinstalowuję&lt;span class="w"&gt; &lt;/span&gt;pakiet&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemu&lt;span class="w"&gt; &lt;/span&gt;sysfs:&lt;span class="w"&gt;
&lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;sysfsutils&lt;span class="w"&gt;

&lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/sysfs.conf&lt;span class="w"&gt; &lt;/span&gt;dopisuję&lt;span class="w"&gt; &lt;/span&gt;linię:&lt;span class="w"&gt;
&lt;/span&gt;module/hid_apple/parameters/fnmode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;można&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;zrobić&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;kilka&lt;span class="w"&gt; &lt;/span&gt;sposobów,&lt;span class="w"&gt; &lt;/span&gt;tu&lt;span class="w"&gt; &lt;/span&gt;jest&lt;span class="w"&gt; &lt;/span&gt;dokładny&lt;span class="w"&gt; &lt;/span&gt;opis:&lt;span class="w"&gt;
&lt;/span&gt;https://help.ubuntu.com/community/AppleKeyboard&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;Reboot&lt;span class="w"&gt; &lt;/span&gt;i...&lt;span class="w"&gt; &lt;/span&gt;wszystko&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;razie&lt;span class="w"&gt; &lt;/span&gt;działa!&lt;span class="w"&gt;

&lt;/span&gt;Sysfs&lt;span class="w"&gt; &lt;/span&gt;przyda&lt;span class="w"&gt; &lt;/span&gt;się&lt;span class="w"&gt; &lt;/span&gt;jeszcze&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;podpięcia&lt;span class="w"&gt; &lt;/span&gt;klawiszy&lt;span class="w"&gt; &lt;/span&gt;obsługujących&lt;span class="w"&gt; &lt;/span&gt;funkcje&lt;span class="w"&gt; &lt;/span&gt;specjalne,&lt;span class="w"&gt;
&lt;/span&gt;takich&lt;span class="w"&gt; &lt;/span&gt;jak:&lt;span class="w"&gt; &lt;/span&gt;jasność&lt;span class="w"&gt; &lt;/span&gt;ekranu,&lt;span class="w"&gt; &lt;/span&gt;podświetlanie&lt;span class="w"&gt; &lt;/span&gt;klawiatury,&lt;span class="w"&gt; &lt;/span&gt;głośność,&lt;span class="w"&gt; &lt;/span&gt;hibernacja/wyłączenie.&lt;span class="w"&gt;
&lt;/span&gt;Najpierw&lt;span class="w"&gt; &lt;/span&gt;kody&lt;span class="w"&gt; &lt;/span&gt;klawiszy&lt;span class="w"&gt; &lt;/span&gt;wyłapane&lt;span class="w"&gt; &lt;/span&gt;za&lt;span class="w"&gt; &lt;/span&gt;pomocą:&lt;span class="w"&gt;
&lt;/span&gt;xev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/^.*keycode *\([0-9]\+\).*$/keycode \1 = /p'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;Fn+F1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;232&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;233&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;212&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F5&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;daje&lt;span class="w"&gt; &lt;/span&gt;nic&lt;span class="w"&gt;
&lt;/span&gt;Fn+F6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;daje&lt;span class="w"&gt; &lt;/span&gt;nic&lt;span class="w"&gt;
&lt;/span&gt;Fn+Shift+F5&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;237&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+Shift+F6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;238&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F7&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;173&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F8&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;172&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F9&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;171&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;121&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F11&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;122&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F12&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;123&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;Nie&lt;span class="w"&gt; &lt;/span&gt;używam&lt;span class="w"&gt; &lt;/span&gt;Capslocka&lt;span class="w"&gt; &lt;/span&gt;więc&lt;span class="w"&gt; &lt;/span&gt;go&lt;span class="w"&gt; &lt;/span&gt;wyłączam&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;~/.Xmodmap:&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;66&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;Podświetlanie&lt;span class="w"&gt;
&lt;/span&gt;Wpisy&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;~/.Xmodmap:&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;232&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessDown&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;233&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessUp&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;237&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessDown&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;238&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessUp&lt;span class="w"&gt;

&lt;/span&gt;Wpisy&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;~/.i3/config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;używałem&lt;span class="w"&gt; &lt;/span&gt;kiedyś&lt;span class="w"&gt; &lt;/span&gt;window&lt;span class="w"&gt; &lt;/span&gt;managera&lt;span class="w"&gt; &lt;/span&gt;i3&lt;span class="o"&gt;)&lt;/span&gt;:&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessUp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;screen-backlight&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessDown&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;screen-backlight&lt;span class="w"&gt; &lt;/span&gt;down&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessDown&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;keyboard-backlight&lt;span class="w"&gt; &lt;/span&gt;down&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessUp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;keyboard-backlight&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt;

&lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin&lt;span class="w"&gt; &lt;/span&gt;skopiowałem&lt;span class="w"&gt; &lt;/span&gt;dwa&lt;span class="w"&gt; &lt;/span&gt;skrypty,&lt;span class="w"&gt; &lt;/span&gt;których&lt;span class="w"&gt; &lt;/span&gt;zadaniem&lt;span class="w"&gt; &lt;/span&gt;jest&lt;span class="w"&gt; &lt;/span&gt;wpisywanie&lt;span class="w"&gt;
&lt;/span&gt;odpowiednich&lt;span class="w"&gt; &lt;/span&gt;wartości&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;sysfs.&lt;span class="w"&gt; &lt;/span&gt;Jeden&lt;span class="w"&gt; &lt;/span&gt;kontroluje&lt;span class="w"&gt; &lt;/span&gt;jasność&lt;span class="w"&gt; &lt;/span&gt;monitora,&lt;span class="w"&gt; &lt;/span&gt;drugi&lt;span class="w"&gt; &lt;/span&gt;jasność&lt;span class="w"&gt;
&lt;/span&gt;podświetlenia&lt;span class="w"&gt; &lt;/span&gt;klawiatury.&lt;span class="w"&gt;
&lt;/span&gt;Ich&lt;span class="w"&gt; &lt;/span&gt;nazwy&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;odpowiednio:&lt;span class="w"&gt; &lt;/span&gt;screen-backlight:&lt;span class="w"&gt;
&lt;/span&gt;https://raw.githubusercontent.com/jessfraz/dotfiles/master/bin/screen-backlight&lt;span class="w"&gt;
&lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;keyboard-backlight:&lt;span class="w"&gt;
&lt;/span&gt;https://raw.githubusercontent.com/jessfraz/dotfiles/master/bin/keyboard-backlight&lt;span class="w"&gt;

&lt;/span&gt;Za&lt;span class="w"&gt; &lt;/span&gt;pomocą&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;dodaję&lt;span class="w"&gt; &lt;/span&gt;odpowiednie&lt;span class="w"&gt; &lt;/span&gt;wpisy&lt;span class="w"&gt; &lt;/span&gt;by&lt;span class="w"&gt; &lt;/span&gt;uruchamiać&lt;span class="w"&gt; &lt;/span&gt;je&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;prawach&lt;span class="w"&gt; &lt;/span&gt;roota&lt;span class="w"&gt; &lt;/span&gt;bez&lt;span class="w"&gt; &lt;/span&gt;podawania&lt;span class="w"&gt; &lt;/span&gt;hasła:&lt;span class="w"&gt;
&lt;/span&gt;paczor&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;NOPASSWD:&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/keyboard-backlight&lt;span class="w"&gt;
&lt;/span&gt;paczor&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;NOPASSWD:&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/screen-backlight&lt;span class="w"&gt;

&lt;/span&gt;Klawiatura&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;dźwięk&lt;span class="w"&gt;
&lt;/span&gt;W&lt;span class="w"&gt; &lt;/span&gt;~/.Xmodmap&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;121&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86AudioMute&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;122&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86AudioLowerVolume&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;123&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86AudioRaiseVolume&lt;span class="w"&gt;
&lt;/span&gt;W&lt;span class="w"&gt; &lt;/span&gt;~/.i3/config:&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# dla PulseAudio:
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioMute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pactl&lt;span class="w"&gt; &lt;/span&gt;set-sink-mute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;toggle&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# dla Alsa
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioMute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;toggle&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioLowerVolume&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioRaiseVolume&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;+&lt;span class="w"&gt;

&lt;/span&gt;Mam&lt;span class="w"&gt; &lt;/span&gt;problem&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;mute,&lt;span class="w"&gt; &lt;/span&gt;zrobiłem&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;raz&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;karta&lt;span class="w"&gt; &lt;/span&gt;już&lt;span class="w"&gt; &lt;/span&gt;milczy.&lt;span class="w"&gt; &lt;/span&gt;Musiałem&lt;span class="w"&gt; &lt;/span&gt;zrobić&lt;span class="w"&gt; &lt;/span&gt;reset&lt;span class="w"&gt; &lt;/span&gt;SMC&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;wyłączony&lt;span class="w"&gt; &lt;/span&gt;komputer&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;trzymając&lt;span class="w"&gt; &lt;/span&gt;Shift+Alt+Command&lt;span class="w"&gt; &lt;/span&gt;naciskam&lt;span class="w"&gt; &lt;/span&gt;Power&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;PRAM&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;wyłączony&lt;span class="w"&gt; &lt;/span&gt;komputer,&lt;span class="w"&gt; &lt;/span&gt;włączam&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;jak&lt;span class="w"&gt; &lt;/span&gt;usłyszę&lt;span class="w"&gt; &lt;/span&gt;dźwięk&lt;span class="w"&gt; &lt;/span&gt;staru&lt;span class="w"&gt; &lt;/span&gt;trzymam&lt;span class="w"&gt; &lt;/span&gt;Alt+Command+P+R&lt;span class="w"&gt; &lt;/span&gt;aż&lt;span class="w"&gt; &lt;/span&gt;usłyszę&lt;span class="w"&gt; &lt;/span&gt;drugi&lt;span class="w"&gt; &lt;/span&gt;dźwięk&lt;span class="w"&gt; &lt;/span&gt;startu&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;wtedy&lt;span class="w"&gt; &lt;/span&gt;puszczam&lt;span class="o"&gt;)&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Nie&lt;span class="w"&gt; &lt;/span&gt;wiem&lt;span class="w"&gt; &lt;/span&gt;czy&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;potrzebne&lt;span class="w"&gt; &lt;/span&gt;ale&lt;span class="w"&gt; &lt;/span&gt;wolałem&lt;span class="w"&gt; &lt;/span&gt;zaczynać&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;czystym&lt;span class="w"&gt; &lt;/span&gt;kontem.&lt;span class="w"&gt; &lt;/span&gt;Musiałem&lt;span class="w"&gt; &lt;/span&gt;też&lt;span class="w"&gt; &lt;/span&gt;ponownie&lt;span class="w"&gt; &lt;/span&gt;użyć&lt;span class="w"&gt; &lt;/span&gt;Refinda.&lt;span class="w"&gt;
&lt;/span&gt;Zainstalowałem&lt;span class="w"&gt; &lt;/span&gt;pulseaudio:&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pulseaudio&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;zainstalowałem:&lt;span class="w"&gt;
&lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;alsa-firmware-loaders&lt;span class="w"&gt;
 &lt;/span&gt;Reboot&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;pomogło!
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="hibernacja"&gt;
&lt;h2&gt;Hibernacja:&lt;/h2&gt;
&lt;p&gt;Najlepiej zacząć od zmiany domyślnej konfiguracji. Uwaga, gdy używałem zamkniętych sterowników Nvidii hibernacja zakończyła się ostatecznie całkowitą rozwałką sytemu. Po przejściu na Intela na razie nie miałem tak tragicznych konsekwencji ale system po zamknięciu klapy laptopa nie przechodził z trybu Suspend w Hibernate. Podejrzewam, że miałem źle skonfigurowane dwa główne pliki. Ale do rzeczyâ€¦&lt;/p&gt;
&lt;p&gt;Konfigurujemy dwa pliki:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;vim&lt;span class="w"&gt;  &lt;/span&gt;/etc/systemd/sleep.conf&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;vim&lt;span class="w"&gt;  &lt;/span&gt;/etc/systemd/logind.conf
&lt;/pre&gt;
&lt;p&gt;W sleep.conf zezwalamy zarówno na Suspend, jak i na Hibernate oraz ustalamy po jakim czasie system będący w Suspend przejdzie w Hibernate jeśli nie nastąpi jakieś przerywające uśpienie zdarzenie (u mnie jest to 10 minut):&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="o"&gt;[&lt;/span&gt;Sleep&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;AllowSuspend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;AllowHibernation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;AllowSuspendThenHibernate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;#AllowHybridSleep=yes
#SuspendMode=
#SuspendState=mem standby freeze
#HibernateMode=platform shutdown
#HibernateState=disk
#HybridSleepMode=suspend platform shutdown
#HybridSleepState=disk
&lt;/span&gt;&lt;span class="nv"&gt;HibernateDelaySec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10m
&lt;/pre&gt;
&lt;p&gt;Natomiast w pliku logind.conf ustawiamy wybrane tryby i zdarzenia, które wyzwalają te tryby. Zdarzeniami są najczęściej: wciśniecie klawisza/przycisku albo zamknięcie pokrywy laptopa.&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="o"&gt;[&lt;/span&gt;Login&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
&lt;/span&gt;&lt;span class="nv"&gt;HandlePowerKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;suspend-then-hibernate&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;HandleSuspendKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;suspend-then-hibernate&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;HandleHibernateKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;suspend-then-hibernate&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;HandleLidSwitch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;suspend-then-hibernate&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;HandleLidSwitchDocked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ignore&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#HoldoffTimeoutSec=30s
&lt;/span&gt;&lt;span class="nv"&gt;IdleAction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;suspend-then-hibernate&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;IdleActionSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10min&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;#RuntimeDirectorySize=10%
#RemoveIPC=yes
#InhibitorsMax=8192
#SessionsMax=8192
#UserTasksMax=33%&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Przydatne informacje są w manualach:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
man&lt;span class="w"&gt; &lt;/span&gt;systemd-sleep.conf&lt;span class="w"&gt;
&lt;/span&gt;man&lt;span class="w"&gt; &lt;/span&gt;logind.conf
&lt;/pre&gt;
&lt;p&gt;Polecenie uaktualniające po zmianie konfiguracji, może nastąpić uśpienie albo hibernacja - zależnie od wprowadzonych zmian:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo systemctl restart systemd-logind.service
&lt;/pre&gt;
&lt;p&gt;Wyświetlenie statusu obsługi:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo systemctl status systemd-logind.service
&lt;/pre&gt;
&lt;p&gt;U mnie zwraca to:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
â&lt;span class="w"&gt; &lt;/span&gt;systemd-logind.service&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Login&lt;span class="w"&gt; &lt;/span&gt;Service&lt;span class="w"&gt;
   &lt;/span&gt;Loaded:&lt;span class="w"&gt; &lt;/span&gt;loaded&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;/lib/systemd/system/systemd-logind.service&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;static&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vendor&lt;span class="w"&gt; &lt;/span&gt;preset:&lt;span class="w"&gt; &lt;/span&gt;enabled&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;Active:&lt;span class="w"&gt; &lt;/span&gt;active&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;running&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;since&lt;span class="w"&gt; &lt;/span&gt;Fri&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2020&lt;/span&gt;-06-12&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:27:31&lt;span class="w"&gt; &lt;/span&gt;CEST&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;11h&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="w"&gt;
     &lt;/span&gt;Docs:&lt;span class="w"&gt; &lt;/span&gt;man:systemd-logind.service&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;man:logind.conf&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;https://www.freedesktop.org/wiki/Software/systemd/logind&lt;span class="w"&gt;
           &lt;/span&gt;https://www.freedesktop.org/wiki/Software/systemd/multiseat&lt;span class="w"&gt;
 &lt;/span&gt;Main&lt;span class="w"&gt; &lt;/span&gt;PID:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;963&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;systemd-logind&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;Status:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Processing requests..."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;Tasks:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;limit:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4915&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;Memory:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.2M&lt;span class="w"&gt;
   &lt;/span&gt;CGroup:&lt;span class="w"&gt; &lt;/span&gt;/system.slice/systemd-logind.service&lt;span class="w"&gt;
           &lt;/span&gt;ââ963&lt;span class="w"&gt; &lt;/span&gt;/lib/systemd/systemd-logind&lt;span class="w"&gt;

&lt;/span&gt;Jun&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:27:31&lt;span class="w"&gt; &lt;/span&gt;eclipse&lt;span class="w"&gt; &lt;/span&gt;systemd-logind&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;963&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Watching&lt;span class="w"&gt; &lt;/span&gt;system&lt;span class="w"&gt; &lt;/span&gt;buttons&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/dev/input/event0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Lid&lt;span class="w"&gt; &lt;/span&gt;Switch&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Jun&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:27:31&lt;span class="w"&gt; &lt;/span&gt;eclipse&lt;span class="w"&gt; &lt;/span&gt;systemd-logind&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;963&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Watching&lt;span class="w"&gt; &lt;/span&gt;system&lt;span class="w"&gt; &lt;/span&gt;buttons&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/dev/input/event2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Sleep&lt;span class="w"&gt; &lt;/span&gt;Button&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Jun&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:27:31&lt;span class="w"&gt; &lt;/span&gt;eclipse&lt;span class="w"&gt; &lt;/span&gt;systemd-logind&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;963&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Watching&lt;span class="w"&gt; &lt;/span&gt;system&lt;span class="w"&gt; &lt;/span&gt;buttons&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;/dev/input/event7&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Apple&lt;span class="w"&gt; &lt;/span&gt;Inc.&lt;span class="w"&gt; &lt;/span&gt;Apple&lt;span class="w"&gt; &lt;/span&gt;Internal&lt;span class="w"&gt; &lt;/span&gt;Keyboard&lt;span class="w"&gt; &lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;Trackpad&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Jun&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:27:31&lt;span class="w"&gt; &lt;/span&gt;eclipse&lt;span class="w"&gt; &lt;/span&gt;systemd&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Started&lt;span class="w"&gt; &lt;/span&gt;Login&lt;span class="w"&gt; &lt;/span&gt;Service.
&lt;/pre&gt;
&lt;p&gt;Jak widać obserwowane są:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Lid Switch - czyli klapa lapa&lt;/li&gt;
&lt;li&gt;Sleep Button - czyli główny wyłącznik&lt;/li&gt;
&lt;li&gt;Apple Internal Keyboard/Trackpad - klawiatura i trackpad, po to żeby wybudzić z uśpienia czyli przerwać odliczanie do hibernacji (to ustawione wcześniej 10 minut)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Polecenie wyłączające suspend i hibernację:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
&lt;/pre&gt;
&lt;p&gt;To raczej ostateczność: &lt;a class="reference external" href="https://itsfoss.com/ubuntu-close-lid-suspend/"&gt;https://itsfoss.com/ubuntu-close-lid-suspend/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy"&gt;
&lt;h2&gt;PROBLEMY&lt;/h2&gt;
&lt;div class="section" id="problemy-z-x"&gt;
&lt;h3&gt;Problemy z X?&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.debian.org/Xsession"&gt;https://wiki.debian.org/Xsession&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy-z-dzwiekiem-przez-displayport"&gt;
&lt;h3&gt;Problemy z dźwiękiem przez DisplayPort?&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unix.stackexchange.com/questions/88118/alsa-how-to-temporarily-change-the-output-device"&gt;https://unix.stackexchange.com/questions/88118/alsa-how-to-temporarily-change-the-output-device&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="touchpad-i-dispad"&gt;
&lt;h3&gt;Touchpad i dispad&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://int3ractive.com/2018/09/make-the-best-of-MacBook-touchpad-on-Ubuntu.html"&gt;https://int3ractive.com/2018/09/make-the-best-of-MacBook-touchpad-on-Ubuntu.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problem-z-xscreensaver"&gt;
&lt;h3&gt;Problem z xscreensaver&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bbs.archlinux.org/viewtopic.php?pid=1218771#p1218771"&gt;https://bbs.archlinux.org/viewtopic.php?pid=1218771#p1218771&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy-z-przerwaniami"&gt;
&lt;h3&gt;Problemy z przerwaniami&lt;/h3&gt;
&lt;p&gt;Chłodzenie Macbooka często â€žwietrzyłoâ€? komputer i pożerało cenne Ampery. Musiałem, jako root, dodać do crontaba linię wyłączającą przerwanie 06:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
@reboot echo "disable" &amp;gt; /sys/firmware/acpi/interrupts/gpe06
&lt;/pre&gt;
&lt;p&gt;Pomogło!&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot"&gt;https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.google.com/search?client=ubuntu&amp;amp;channel=fs&amp;amp;q=linux+disable+acpi+interrrupt&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;https://www.google.com/search?client=ubuntu&amp;amp;channel=fs&amp;amp;q=linux+disable+acpi+interrrupt&amp;amp;ie=utf-8&amp;amp;oe=utf-8&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="rozne-porady"&gt;
&lt;h2&gt;Różne porady&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://martinralbrecht.wordpress.com/2014/05/03/debiantesting-on-macbook-pro-113/"&gt;https://martinralbrecht.wordpress.com/2014/05/03/debiantesting-on-macbook-pro-113/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://apfelkraut.org/2017/06/howto-debian-gnulinux-stretch-as-dual-boot-on-a-macbookpro113/"&gt;https://apfelkraut.org/2017/06/howto-debian-gnulinux-stretch-as-dual-boot-on-a-macbookpro113/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://blog.sviluppoweb.eu/2014/02/20/debian-on-macbook-pro-retina-15/"&gt;https://blog.sviluppoweb.eu/2014/02/20/debian-on-macbook-pro-retina-15/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://int3ractive.com/2019/12/things-to-do-after-installing-ubuntu-mate.html"&gt;https://int3ractive.com/2019/12/things-to-do-after-installing-ubuntu-mate.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://blog.jessfraz.com/post/linux-on-mac/"&gt;https://blog.jessfraz.com/post/linux-on-mac/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://linuxnewbieguide.org/how-to-install-linux-on-a-macintosh-computer/"&gt;https://linuxnewbieguide.org/how-to-install-linux-on-a-macintosh-computer/&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="systemd"&gt;
&lt;h3&gt;Systemd&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://www.dobreprogramy.pl/mariushko/Poradnik-systemd-cz.-1,67627.html"&gt;https://www.dobreprogramy.pl/mariushko/Poradnik-systemd-cz.-1,67627.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/index.php/Systemd/User"&gt;https://wiki.archlinux.org/index.php/Systemd/User&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="software"&gt;
&lt;h2&gt;SOFTWARE&lt;/h2&gt;
&lt;div class="section" id="mutt-wole-alpine"&gt;
&lt;h3&gt;MUTT (wolę Alpine)&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Instalacja mutta i konfigurowanie wielu kont. Tu podparłem się doskonałą stroną: &lt;a class="reference external" href="https://www.df7cb.de/blog/2010/Using_multiple_IMAP_accounts_with_Mutt.html"&gt;https://www.df7cb.de/blog/2010/Using_multiple_IMAP_accounts_with_Mutt.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;Wszystko pięknie zadziałało.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Do mutta dołożyłem książkę adresową zasysaną z Ownclouda wg. tego przepisu: &lt;a class="reference external" href="https://got-tty.org/mutt-kontakte-aus-owncloud-nutzen"&gt;https://got-tty.org/mutt-kontakte-aus-owncloud-nutzen&lt;/a&gt; (po niemiecku ale wszystko zrozumiałe).&lt;/p&gt;
&lt;p&gt;Oglądanie urli za pomocą linksa albo lynxa:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
apt-get install urlview
&lt;/pre&gt;
&lt;p&gt;Do ~/.muttrc:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
macro pager \cu |urlview\n
&lt;/pre&gt;
&lt;p&gt;Skopiowałem /etc/urlview/system.urlview i /etc/urlview/url_handler.sh lokalnie bo chciałem zmienić kolejność szukanych browserów, a nie chcę ustawiać zmiennej BROWSER.&lt;/p&gt;
&lt;p&gt;p.s. Na koniec i tak wróciłem do Alpine i chwalę sobie. Działa przepięknie, konfigurację opisałem w innym artykule:&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="firefox-vimperator-tridactyl-lepszy"&gt;
&lt;h3&gt;FIREFOX + VIMPERATOR (Tridactyl lepszy)&lt;/h3&gt;
&lt;p&gt;Vimperator ma buga: w trybie pełnoekranowym F11 znika statusbar i przestają działać hinty. Rozwiązaniem jest zablokowanie automatycznego&lt;/p&gt;
&lt;p&gt;chowania się statusbaru. W vimperatorze wydajemy komendę:&lt;/p&gt;
&lt;p&gt;:set statuslinevisibility=visible&lt;/p&gt;
&lt;p&gt;i zachowujemy do pliku konfiguracyjnego:&lt;/p&gt;
&lt;p&gt;mkvimperatorrc&lt;/p&gt;
&lt;p&gt;p.s. Przerzuciłem się na Tridactyla: &lt;a class="reference external" href="https://github.com/tridactyl/tridactyl"&gt;https://github.com/tridactyl/tridactyl&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="vpn"&gt;
&lt;h3&gt;VPN:&lt;/h3&gt;
&lt;p&gt;Używam skomplikowanego systemu skryptów, który jest łatwy w obsłudze. Opiszę to kiedyś, jeśli pokonam uczucie żenady w jaki sposób to działa albo przepiszę pod Pythonem.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://site.elastichosts.com/blog/linux-l2tpipsec-vpn-client/"&gt;https://site.elastichosts.com/blog/linux-l2tpipsec-vpn-client/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="xmonad"&gt;
&lt;h3&gt;Xmonad:&lt;/h3&gt;
&lt;p&gt;Używam xmonada bo jest szalenie piękny! Konfiguracja trwała długo i jeszcze nie jest pełna. Opis zajmie osobny wpis. Tutaj wstęp i sugestia:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://xiangji.me/2018/11/19/my-xmonad-configuration/"&gt;https://xiangji.me/2018/11/19/my-xmonad-configuration/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="rofi-i-skrypty"&gt;
&lt;h3&gt;Rofi i skrypty&lt;/h3&gt;
&lt;p&gt;Posiadam sporą kolekcję skryptów w Bashu wykorzystujących Rofi switcher: &lt;a class="reference external" href="https://github.com/davatorium/rofi"&gt;https://github.com/davatorium/rofi&lt;/a&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br/&gt;&lt;/div&gt;
&lt;div class="line"&gt;rofi do VPN (skrypt wyświetlający połączone VPN-y),&lt;/div&gt;
&lt;div class="line"&gt;rofi do Mikrotika (steruję zdalnie routerem),&lt;/div&gt;
&lt;div class="line"&gt;rofi do wyświetlania Helpa (jeden skrót i widzę podpowiedzi),&lt;/div&gt;
&lt;div class="line"&gt;rofi do qalc (jeden skrót i liczę oraz konwertuję).&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="khal-vdirsyncer-oraz-keyring"&gt;
&lt;h3&gt;khal, vdirsyncer oraz keyring&lt;/h3&gt;
&lt;p&gt;Używam khal do obsługi kalendarzy w chmurze, vdirsyncer synchronizuje zarówno kalendarze jak i książkę adresową, a keyring sprawia, że nie muszę wpisywać hasła. Polecam.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mariadb"&gt;
&lt;h3&gt;MariaDB&lt;/h3&gt;
&lt;p&gt;Po â€žsudo rebootâ€? bardzo długo zamyka się system, wyświetlając komunikat: â€œA stop job is running to â€¦â€?. Pomaga to:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;sudo &lt;span class="pre"&gt;dpkg-reconfigure&lt;/span&gt; tzdata&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="nextcloud-client"&gt;
&lt;h3&gt;Nextcloud client:&lt;/h3&gt;
&lt;pre class="code bash literal-block"&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/sources.list.d/nextcloud-devs-ubuntu-client-groovy.list&lt;span class="w"&gt;
&lt;/span&gt;deb&lt;span class="w"&gt; &lt;/span&gt;http://ppa.launchpad.net/nextcloud-devs/client/ubuntu&lt;span class="w"&gt; &lt;/span&gt;groovy&lt;span class="w"&gt; &lt;/span&gt;main&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;#deb-src http://ppa.launchpad.net/nextcloud-devs/client/ubuntu groovy main
&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;--keyserver&lt;span class="w"&gt; &lt;/span&gt;keyserver.ubuntu.com&lt;span class="w"&gt; &lt;/span&gt;--recv&lt;span class="w"&gt; &lt;/span&gt;60EE47FBAD3DD469&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;--export&lt;span class="w"&gt; &lt;/span&gt;--armor&lt;span class="w"&gt; &lt;/span&gt;60EE47FBAD3DD469&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-key&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="virtualbox"&gt;
&lt;h3&gt;VirtualBox:&lt;/h3&gt;
&lt;pre class="code bash literal-block"&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/sources.list.d/virtualbox.list&lt;span class="w"&gt;
&lt;/span&gt;deb&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;arch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amd64&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;https://download.virtualbox.org/virtualbox/debian&lt;span class="w"&gt; &lt;/span&gt;buster&lt;span class="w"&gt; &lt;/span&gt;contrib&lt;span class="w"&gt;

&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;https://www.virtualbox.org/download/oracle_vbox_2016.asc&lt;span class="w"&gt; &lt;/span&gt;-O-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-key&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;https://www.virtualbox.org/download/oracle_vbox.asc&lt;span class="w"&gt; &lt;/span&gt;-O-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-key&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;virtualbox-6.1&lt;span class="w"&gt;
&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://download.virtualbox.org/virtualbox/6.1.6/Oracle_VM_VirtualBox_Extension_Pack-6.1.6.vbox-extpack&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;virtualbox&lt;span class="w"&gt; &lt;/span&gt;Downloads/Oracle_VM_VirtualBox_Extension_Pack-6.1.6.vbox-extpack&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;usermod&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-G&lt;span class="w"&gt; &lt;/span&gt;vboxusers&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="partycje-apfs"&gt;
&lt;h3&gt;Partycje APFS:&lt;/h3&gt;
&lt;p&gt;Dostęp do partycji Apple Filesystem:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
https://linuxnewbieguide.org/how-to-mount-macos-apfs-disk-volumes-in-linux
&lt;/pre&gt;
&lt;p&gt;APFS z dysku: &lt;a class="reference external" href="https://github.com/sgan81/apfs-fuse"&gt;https://github.com/sgan81/apfs-fuse&lt;/a&gt;&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;fuse&lt;span class="w"&gt; &lt;/span&gt;libfuse3-dev&lt;span class="w"&gt; &lt;/span&gt;bzip2&lt;span class="w"&gt; &lt;/span&gt;libbz2-dev&lt;span class="w"&gt; &lt;/span&gt;cmake&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;libattr1-dev&lt;span class="w"&gt; &lt;/span&gt;zlib1g-dev&lt;span class="w"&gt;
&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/sgan81/apfs-fuse.git&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apfs-fuse&lt;span class="w"&gt;
&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;submodule&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt;
&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;submodule&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt;
&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt;
&lt;/span&gt;cmake&lt;span class="w"&gt; &lt;/span&gt;..&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# jeśli chcesz zmienić ustawienia to:
# sudo apt install cmake-curses-gui
# ccmake .
&lt;/span&gt;make&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;apfsutil&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# wylistowanie dostępnych partycji i nazw woluminów
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apfsutil&lt;span class="w"&gt; &lt;/span&gt;/dev/sdc2&lt;span class="w"&gt;

&lt;/span&gt;Volume&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;FD331FC1-1327-45D7-7538-E6B19B5139F6&lt;span class="w"&gt;
&lt;/span&gt;---------------------------------------------&lt;span class="w"&gt;
&lt;/span&gt;Role:&lt;span class="w"&gt;               &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;specific&lt;span class="w"&gt; &lt;/span&gt;role&lt;span class="w"&gt;
&lt;/span&gt;Name:&lt;span class="w"&gt;               &lt;/span&gt;MEDIA-torba&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Case-insensitive&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Capacity&lt;span class="w"&gt; &lt;/span&gt;Consumed:&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;18652901376&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Bytes&lt;span class="w"&gt;
&lt;/span&gt;FileVault:&lt;span class="w"&gt;          &lt;/span&gt;No&lt;span class="w"&gt;

&lt;/span&gt;Volume&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;AA7F7F57-D871-4570-A6C9-CAC113F57167&lt;span class="w"&gt;
&lt;/span&gt;---------------------------------------------&lt;span class="w"&gt;
&lt;/span&gt;Role:&lt;span class="w"&gt;               &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;specific&lt;span class="w"&gt; &lt;/span&gt;role&lt;span class="w"&gt;
&lt;/span&gt;Name:&lt;span class="w"&gt;               &lt;/span&gt;VIRT-torba&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Case-insensitive&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Capacity&lt;span class="w"&gt; &lt;/span&gt;Consumed:&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;174489903104&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Bytes&lt;span class="w"&gt;
&lt;/span&gt;FileVault:&lt;span class="w"&gt;          &lt;/span&gt;No&lt;span class="w"&gt;


&lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;montując&lt;span class="w"&gt; &lt;/span&gt;należy&lt;span class="w"&gt; &lt;/span&gt;podać&lt;span class="w"&gt; &lt;/span&gt;nazwę&lt;span class="w"&gt; &lt;/span&gt;voluminu,&lt;span class="w"&gt; &lt;/span&gt;np.&lt;span class="w"&gt; &lt;/span&gt;żeby&lt;span class="w"&gt; &lt;/span&gt;zamontować&lt;span class="w"&gt; &lt;/span&gt;volume&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;:&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apfs-fuse&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;,gid&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;,allow_other&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/sdc2&lt;span class="w"&gt; &lt;/span&gt;/mnt/torba&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# opcje po -o, pozwalają na dostęp userom
&lt;/span&gt;A&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;stałe&lt;span class="w"&gt; &lt;/span&gt;dodać&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/fstab:&lt;span class="w"&gt;

&lt;/span&gt;mount.apfs#/dev/sdc2&lt;span class="w"&gt;    &lt;/span&gt;/mnt/apple_hd&lt;span class="w"&gt;   &lt;/span&gt;fuse&lt;span class="w"&gt;  &lt;/span&gt;user,allow_other&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="an2linux"&gt;
&lt;h3&gt;an2linux&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;tt class="docutils literal"&gt;Czyli powiadomienia z Androida na laptopie:&lt;/tt&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;`https://github.com/rootkiwi/an2linuxserver&lt;/span&gt;&lt;/tt&gt; &amp;lt;&lt;a class="reference external" href="https://github.com/rootkiwi/an2linuxserver"&gt;https://github.com/rootkiwi/an2linuxserver&lt;/a&gt;&amp;gt;`__&lt;/div&gt;
&lt;div class="line"&gt;&lt;tt class="docutils literal"&gt;instalacja w systemd:&lt;/tt&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;`https://github.com/rootkiwi/an2linuxserver/tree/master/init/systemd-user&lt;/span&gt;&lt;/tt&gt; &amp;lt;&lt;a class="reference external" href="https://github.com/rootkiwi/an2linuxserver/tree/master/init/systemd-user"&gt;https://github.com/rootkiwi/an2linuxserver/tree/master/init/systemd-user&lt;/a&gt;&amp;gt;`__&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="tlpd-energia"&gt;
&lt;h3&gt;TLPd (energia)&lt;/h3&gt;
&lt;p&gt;Nie próbowałem.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://linrunner.de/tlp/"&gt;https://linrunner.de/tlp/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bzdurki"&gt;
&lt;h3&gt;Bzdurki&lt;/h3&gt;
&lt;p&gt;Fortunki: &lt;a class="reference external" href="https://github.com/maxieds/math-fortune-mod"&gt;https://github.com/maxieds/math-fortune-mod&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cool Rerto Term: &lt;a class="reference external" href="https://github.com/Swordfish90/cool-retro-term"&gt;https://github.com/Swordfish90/cool-retro-term&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Linux"></category><category term="systemy"></category><category term="programowanie"></category><category term="administracja"></category></entry><entry><title>Nie ma playera nad mplayera</title><link href="https://scyzoryk.fubar.pl/nie_ma_playera_nad_mplayera.html" rel="alternate"></link><published>2021-01-28T11:56:00+01:00</published><updated>2021-01-28T11:56:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2021-01-28:/nie_ma_playera_nad_mplayera.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Na jednym ze znanych portali pojawił się artykuł wychwalający polskie odtwarzacze wideo. Rzeczywiście, coś było pod Windows, co było niezłe i czego podobno, z powodzeniem, używał też świat.&lt;/p&gt;
&lt;p&gt;Czytając tekst o najlepszym playerze, jakim był SubEdit Player, uświadomiłem sobie, że widzę okres największej …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Na jednym ze znanych portali pojawił się artykuł wychwalający polskie odtwarzacze wideo. Rzeczywiście, coś było pod Windows, co było niezłe i czego podobno, z powodzeniem, używał też świat.&lt;/p&gt;
&lt;p&gt;Czytając tekst o najlepszym playerze, jakim był SubEdit Player, uświadomiłem sobie, że widzę okres największej sławy programu z zupełnie innej perpsektywy bo...&lt;/p&gt;
&lt;p&gt;...bo "siedziałem" na Linuksie. Na nim niepodzielnie królował MPlayer. Domenę &lt;a class="reference external" href="http://www.mplayerhq.hu"&gt;mplayerhq.hu&lt;/a&gt; znałem na pamięć i śniła mi się po nocach. No, może przesadziłem, ale tylko trochę.&lt;/p&gt;
&lt;p&gt;MPlayera kompilowałem dziesiątki razy, próbując w ten sposób wycisnąć z moich maszyn ostatnie cykle. Był, czy raczej jest, szybki jak gazela, zwinny jak fredka i wciąż ma najlepszy interfejs na świecie! Bo ŻADEN.&lt;/p&gt;
&lt;p&gt;Interfejs w MPlayerze to niedoścignionie cudo projektowania UX. Gdy używam MPlayera, pomysły Jonathana Ive - tego od iMaca - wyglądają jak lameriada, jak tanie plastikowe zabawki z Chin. Taki design kocha się od pierwszego użycia. No bo jak nie kochać pomysłu, aby w programie do wyświetlania filmu nie zasłaniać ekranu niepotrzebnymi gadżetami?&lt;/p&gt;
&lt;p&gt;W MPlayerze operuje się klawiszami, nie skrótami, które wyginają palce i przyśpieszają artretyzm, ale pojedynczymi klawiszami. Dla przykładu gdy chcę zobaczyć ile filmu jeszcze zostało do końca? Naciskam literę "o". Chcę przewinąć do przodu, naciskam strzałkę w prawo, chcę przewinąć ale o dłuższy czas - naciskam strzałkę w górę. Kto myśli, że to niewygodne niech obsłuży swojego playera jedną ręką, skoro w drugiej trzyma butelkę z piwem.&lt;/p&gt;
&lt;p&gt;MPlayera można obsłużyć dużym paluchem u nogi, małym nie próbowałem.&lt;/p&gt;
&lt;p&gt;Ale jest jeszcze jedna niespodzianka, za którą tak kocha się MPlayera: skróty są intuicyjne. Serio! Zupełnie jak w VIM-ie. Steve Jobs złapałby się za trzustkę z zazdrości gdyby miał MPlayera. Kto używa VIM-a ten wie, że "b" to&lt;/p&gt;
</content><category term="Multimedia"></category><category term="video"></category><category term="mplayer"></category></entry><entry><title>Youtuberzy</title><link href="https://scyzoryk.fubar.pl/youtuberzy.html" rel="alternate"></link><published>2020-12-11T00:43:00+01:00</published><updated>2020-12-11T00:43:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-12-11:/youtuberzy.html</id><summary type="html">&lt;p&gt;Jeśli na pytanie "kim chcesz zostać jak dorośniesz?" dziecko odpowie ci, że Youtuberem, palnij je w łeb i daj do przeczytania &lt;a class="reference external" href="https://www.fastcompany.com/40537244/96-5-of-youtube-creators-dont-make-above-the-u-s-poverty-line"&gt;tę krótką notatkę&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nowe badania pokazują, że przygnębiająco trudno jest zarobić na przyzwoite życie będąc YouTuberem, donosi Bloomberg. Badania przeprowadzone przez Mathiasa BÃ¤rtla, profesora Uniwersytetu Nauk Stosowanych w …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jeśli na pytanie "kim chcesz zostać jak dorośniesz?" dziecko odpowie ci, że Youtuberem, palnij je w łeb i daj do przeczytania &lt;a class="reference external" href="https://www.fastcompany.com/40537244/96-5-of-youtube-creators-dont-make-above-the-u-s-poverty-line"&gt;tę krótką notatkę&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nowe badania pokazują, że przygnębiająco trudno jest zarobić na przyzwoite życie będąc YouTuberem, donosi Bloomberg. Badania przeprowadzone przez Mathiasa BÃ¤rtla, profesora Uniwersytetu Nauk Stosowanych w Offenburgu w Niemczech, ujawniają kilka przygnębiających statystyk:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;96,5% YouTuberów zarabia mniej niż 12140 dolarów w rok (federalna granica ubóstwa),&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;tylko 3% najbardziej oglądanych kanałów przynosi dochody z reklam w wysokości około 16 800 dolarów rocznie.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;To jest pomimo tego, że najlepsze 3% generuje średnio 1,4 miliona odsłon miesięcznie.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Najlepszy 1% twórców YouTube otrzymuje od 2,2 mln do 42,1 mln odsłon miesięcznie (w 2016).&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dolne 85% twórców YouTube zdobywało średnio tylko 485 odsłon miesięcznie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Krótko mówiąc, milionowe gwiazdy YouTube, są wyjątkiem, a nie regułą.&lt;/p&gt;
&lt;p&gt;Jeśli masz córkę to namów ją na szycie zasłon, jeśli chłopaka - niech się weźmie za malowanie wnętrz albo hydraulikę.&lt;/p&gt;
&lt;p&gt;Kalkulator: &lt;a class="reference external" href="https://influencermarketinghub.com/youtube-money-calculator/"&gt;https://influencermarketinghub.com/youtube-money-calculator/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Screenshot strony, w razie gdyby przestała działać:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image1" src="/uploads/2020/11/yt-creators.png" style="width: 600px;"/&gt;&lt;/p&gt;
</content><category term="Wypociny"></category><category term="youtube"></category><category term="google"></category></entry><entry><title>Debian na Macbooku Pro Late 2013 cz.4</title><link href="https://scyzoryk.fubar.pl/debian-na-macbooku-pro-late-2013-cz-4.html" rel="alternate"></link><published>2020-12-08T08:06:00+01:00</published><updated>2020-12-08T08:06:00+01:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2020-12-08:/debian-na-macbooku-pro-late-2013-cz-4.html</id><summary type="html">&lt;p&gt;Niniejszy artykuł powstał ponad rok temu i przeleżał wszystkie te mesiące w postaci szkicu, uzupełnianego o nowe pozycje. Nowości pojawiały się w nim w miarę jak dostrajałem Macbooka do swoich skromnych potrzeb, a były to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pozbycie się macOS, systemu który przestał być wygodny,&lt;/li&gt;
&lt;li&gt;działające X-y z możliwością przełączenia na konsolę …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Niniejszy artykuł powstał ponad rok temu i przeleżał wszystkie te mesiące w postaci szkicu, uzupełnianego o nowe pozycje. Nowości pojawiały się w nim w miarę jak dostrajałem Macbooka do swoich skromnych potrzeb, a były to:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;pozbycie się macOS, systemu który przestał być wygodny,&lt;/li&gt;
&lt;li&gt;działające X-y z możliwością przełączenia na konsolę (to się nie udało i raczej już nie uda),&lt;/li&gt;
&lt;li&gt;Xmonad jako Window Manager, xmobar jako centrum informacyjne,&lt;/li&gt;
&lt;li&gt;działające specjalne funkcje (regulacja podświelenia klawiatury, monitora, regulacja dźwięku, itd.),&lt;/li&gt;
&lt;li&gt;trackpad działający równie gładko jak w macOS (udało się połowicznie),&lt;/li&gt;
&lt;li&gt;działające WiFi,&lt;/li&gt;
&lt;li&gt;działająca hibenacja&lt;/li&gt;
&lt;li&gt;drobne usprawnienia software'owe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instalację wykonałem podobnie jak w opisie z (&lt;a class="reference external" href="https://blog.jessfraz.com/post/linux-on-mac/"&gt;https://blog.jessfraz.com/post/linux-on-mac/&lt;/a&gt;), tzn. że również mam refinda jako bootmanagera, trochę tylko podkoloryzowanego, żeby robić wrażenie.&lt;/p&gt;
&lt;p&gt;Pierwotnie zainstalowałem kernel 3.18.36. Włączyłem obsługę Thunderbolta. Kartę Ethernet mam na USB i działa z difoltu więc bez kłopotów mogłem od razu uaktualniać i instalować software.&lt;/p&gt;
&lt;div class="section" id="terminal"&gt;
&lt;span id="kt-adv-heading-31ff73-45"&gt;&lt;/span&gt;&lt;h2&gt;Terminal&lt;/h2&gt;
&lt;p&gt;Zmieniłem fonty  w konsoli na czytelne. Można jednorazowo:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;setfont &lt;span class="pre"&gt;/usr/share/consolefonts/Lat7-Terminus28x14.psf&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;lub na stałe:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dpkg-reconfigure&lt;/span&gt; &lt;span class="pre"&gt;-plow&lt;/span&gt; &lt;span class="pre"&gt;console-setup&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Sprawdź jak ustawiać kolory w konsoli: &lt;a class="reference external" href="http://user.it.uu.se/~embe8573/cols/www/index.html"&gt;http://user.it.uu.se/~embe8573/cols/www/index.html&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
Linux VTs

    big Linux VT tutorial: COLORS with zsh tools
    ~/cols/ run - script to invoke (see the # comments)
    ~/cols/ set_cols.sed - sed program to set the colors
    color sets
    ls(1) colors (VTs and X) with dircolors(1)

xterm

    ~/.Xresources - invoke in ~/.xinitrc with xrdb

Emacs

    emacs-test-faces.el - looks like this
    captain-mr-king.el - looks like this
&lt;/pre&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="xorg"&gt;
&lt;h2&gt;Xorg&lt;/h2&gt;
&lt;div class="section" id="nvidia"&gt;
&lt;h3&gt;Nvidia&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Xorg działało od razu na driverze nouveau czyli opensourcowym sterowniku dla Nvidii.&lt;/div&gt;
&lt;div class="line"&gt;Zachciało mi się jednak oryginalnego sterownika. Mimo wielu prób nie kopilowały mi się moduły jądra. Podczas kompilacji wyskakiwał błąd, że brak jest pliku include/generated/autoconf.h, chociaż plik jak najbardziej był na właściwym miejscu.&lt;/div&gt;
&lt;div class="line"&gt;Nie chciało mi się kopać z koniem, inni też się wymęczyli, więc użyłem repozytorium jessie-backports (wg.: &lt;a class="reference external" href="https://wiki.debian.org/NvidiaGraphicsDrivers#jessie-352"&gt;https://wiki.debian.org/NvidiaGraphicsDrivers#jessie-352&lt;/a&gt;):&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;do /etc/apt/sources.list dodałem:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
deb&lt;span class="w"&gt; &lt;/span&gt;http://httpredir.debian.org/debian&lt;span class="w"&gt; &lt;/span&gt;jessie-backports&lt;span class="w"&gt; &lt;/span&gt;main&lt;span class="w"&gt; &lt;/span&gt;contrib&lt;span class="w"&gt; &lt;/span&gt;non-free
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
apt-get&lt;span class="w"&gt; &lt;/span&gt;update
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
apt-get install -t jessie-backports nvidia-driver
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Trzeba usunąć /etc/X11/xorg.conf, bez niego server X używa domyślnych ustawień i działa prawidłowo.&lt;/div&gt;
&lt;div class="line"&gt;Na konfigurację przyjdzie jeszcze czas...&lt;/div&gt;
&lt;div class="line"&gt;Przerzuciłem się na zamknięty sterownik od NVidii (ten z .run na końcu). Jest OK ale nadal nie działa przechodzenie między X-ami, a konsolą. Podobno ten trick załatwia sprawę:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Aktualizacja:&lt;/em&gt; niestety, to nie działa.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="wifi"&gt;
&lt;h2&gt;WiFi&lt;/h2&gt;
&lt;pre class="code bash literal-block"&gt;
apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;jessie-backports&lt;span class="w"&gt; &lt;/span&gt;broadcom-sta-dkms
&lt;/pre&gt;
&lt;p&gt;Ale nie kompiluje się sterownik do karty WiFi.&lt;/p&gt;
&lt;p&gt;:(pactl set-sink-mute 1 toggle&lt;/p&gt;
&lt;p&gt;Powrót do kernela 3.17.4.&lt;/p&gt;
&lt;p&gt;I od razu skasowanie nieudanego 3.18.36:&lt;/p&gt;
&lt;p&gt;ap-get purge --auto-remove linux-image-3.18.*&lt;/p&gt;
&lt;p&gt;Jeśli robiło się już:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;firmware-linux-nonfree&lt;span class="w"&gt; &lt;/span&gt;broadcom-sta-dkms
&lt;/pre&gt;
&lt;p&gt;to ponowna kompilacja modułów do kernela 3.17.4:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
dkms&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;broadcom-sta&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;.30.223.248&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.17.4
&lt;/pre&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;Teraz przełączenie klawiszy funkcyjnych w działanie takie jak w PC czyli tylko z wciśniętym Fn
funkcyjny daje dodatkową funkcję.&lt;/p&gt;
&lt;p&gt;Doinstalowuję pakiet do systemu sysfs:
apt-get install sysfsutils
a do /etc/sysfs.conf dopisuję linię:
module/hid_apple/parameters/fnmode = 2
(można to zrobić na kilka sposobów, tu jest dokładny opis:
&lt;a class="reference external" href="https://help.ubuntu.com/community/AppleKeyboard"&gt;https://help.ubuntu.com/community/AppleKeyboard&lt;/a&gt;)
Reboot i... wszystko na razie działa!&lt;/p&gt;
&lt;p&gt;Sysfs przyda się jeszcze do podpięcia klawiszy obsługujących funkcje spacjalne,
takich jak: jasność ekranu, podświetlanie klawiatury, głośność, hibernacja/wyłączenie.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;pre class="code bash literal-block"&gt;
KLAWIATURA&lt;span class="w"&gt;
&lt;/span&gt;Najpierw&lt;span class="w"&gt; &lt;/span&gt;kody&lt;span class="w"&gt; &lt;/span&gt;klawiszy&lt;span class="w"&gt; &lt;/span&gt;wyłapane&lt;span class="w"&gt; &lt;/span&gt;za&lt;span class="w"&gt; &lt;/span&gt;pomocą:&lt;span class="w"&gt;
&lt;/span&gt;xev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/^.*keycode *\([0-9]\+\).*$/keycode \1 = /p'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;Fn+F1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;232&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F2&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;233&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F3&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;212&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F5&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;daje&lt;span class="w"&gt; &lt;/span&gt;nic&lt;span class="w"&gt;
&lt;/span&gt;Fn+F6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;daje&lt;span class="w"&gt; &lt;/span&gt;nic&lt;span class="w"&gt;
&lt;/span&gt;Fn+Shift+F5&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;237&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+Shift+F6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;238&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F7&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;173&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F8&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;172&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F9&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;171&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F10&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;121&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F11&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;122&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Fn+F12&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;123&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;Nie&lt;span class="w"&gt; &lt;/span&gt;używam&lt;span class="w"&gt; &lt;/span&gt;Capslocka&lt;span class="w"&gt; &lt;/span&gt;więc&lt;span class="w"&gt; &lt;/span&gt;go&lt;span class="w"&gt; &lt;/span&gt;wyłączam&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;~/.Xmodmap:&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;66&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;Podświetlanie&lt;span class="w"&gt;
&lt;/span&gt;Wpisy&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;~/.Xmodmap:&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;232&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessDown&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;233&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessUp&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;237&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessDown&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;238&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessUp&lt;span class="w"&gt;

&lt;/span&gt;Wpisy&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;~/.i3/config&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessUp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;screen-backlight&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86MonBrightnessDown&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;screen-backlight&lt;span class="w"&gt; &lt;/span&gt;down&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessDown&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;keyboard-backlight&lt;span class="w"&gt; &lt;/span&gt;down&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86KbdBrightnessUp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;keyboard-backlight&lt;span class="w"&gt; &lt;/span&gt;up&lt;span class="w"&gt;

&lt;/span&gt;Do&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin&lt;span class="w"&gt; &lt;/span&gt;skopiowałem&lt;span class="w"&gt; &lt;/span&gt;dwa&lt;span class="w"&gt; &lt;/span&gt;skrypty,&lt;span class="w"&gt; &lt;/span&gt;których&lt;span class="w"&gt; &lt;/span&gt;zadaniem&lt;span class="w"&gt; &lt;/span&gt;jest&lt;span class="w"&gt; &lt;/span&gt;wpisywanie&lt;span class="w"&gt;
&lt;/span&gt;odpowiednich&lt;span class="w"&gt; &lt;/span&gt;wartości&lt;span class="w"&gt; &lt;/span&gt;w&lt;span class="w"&gt; &lt;/span&gt;sysfs.&lt;span class="w"&gt; &lt;/span&gt;Jeden&lt;span class="w"&gt; &lt;/span&gt;kontroluje&lt;span class="w"&gt; &lt;/span&gt;jasność&lt;span class="w"&gt; &lt;/span&gt;monitora,&lt;span class="w"&gt; &lt;/span&gt;drugi&lt;span class="w"&gt; &lt;/span&gt;jasność&lt;span class="w"&gt;
&lt;/span&gt;podświetlenia&lt;span class="w"&gt; &lt;/span&gt;klawiatury.&lt;span class="w"&gt;
&lt;/span&gt;Ich&lt;span class="w"&gt; &lt;/span&gt;nazwy&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;odpowiednio:&lt;span class="w"&gt; &lt;/span&gt;screen-backlight&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;keyboard-backlight.&lt;span class="w"&gt;
&lt;/span&gt;Za&lt;span class="w"&gt; &lt;/span&gt;pomocą&lt;span class="w"&gt; &lt;/span&gt;visudo&lt;span class="w"&gt; &lt;/span&gt;dodaję&lt;span class="w"&gt; &lt;/span&gt;odpowiednie&lt;span class="w"&gt; &lt;/span&gt;wpisy&lt;span class="w"&gt; &lt;/span&gt;by&lt;span class="w"&gt; &lt;/span&gt;uruchamiać&lt;span class="w"&gt; &lt;/span&gt;je&lt;span class="w"&gt; &lt;/span&gt;na&lt;span class="w"&gt; &lt;/span&gt;prawach&lt;span class="w"&gt; &lt;/span&gt;roota&lt;span class="w"&gt; &lt;/span&gt;bez&lt;span class="w"&gt; &lt;/span&gt;podawania&lt;span class="w"&gt; &lt;/span&gt;hasła:&lt;span class="w"&gt;
&lt;/span&gt;paczor&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;NOPASSWD:&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/keyboard-backlight&lt;span class="w"&gt;
&lt;/span&gt;paczor&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;NOPASSWD:&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/screen-backlight&lt;span class="w"&gt;

&lt;/span&gt;Klawiatura&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;dźwięk
&lt;/pre&gt;
&lt;p&gt;W ~/.Xmodmap&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;121&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86AudioMute&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;122&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86AudioLowerVolume&lt;span class="w"&gt;
&lt;/span&gt;keycode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;123&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;XF86AudioRaiseVolume
&lt;/pre&gt;
&lt;p&gt;W ~/.i3/config:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="c1"&gt;# dla PulseAudio:
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioMute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pactl&lt;span class="w"&gt; &lt;/span&gt;set-sink-mute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;toggle&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# dla Alsa
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioMute&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;toggle&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioLowerVolume&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;bindsym&lt;span class="w"&gt; &lt;/span&gt;XF86AudioRaiseVolume&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;+&lt;span class="w"&gt;

&lt;/span&gt;Mam&lt;span class="w"&gt; &lt;/span&gt;problem&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;mute,&lt;span class="w"&gt; &lt;/span&gt;zrobiłem&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;raz&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;karta&lt;span class="w"&gt; &lt;/span&gt;już&lt;span class="w"&gt; &lt;/span&gt;milczy.&lt;span class="w"&gt; &lt;/span&gt;Musiałem&lt;span class="w"&gt; &lt;/span&gt;zrobić&lt;span class="w"&gt; &lt;/span&gt;reset&lt;span class="w"&gt; &lt;/span&gt;SMC&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;wyłączony&lt;span class="w"&gt; &lt;/span&gt;komputer&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;trzymając&lt;span class="w"&gt; &lt;/span&gt;Shift+Alt+Command&lt;span class="w"&gt; &lt;/span&gt;naciskam&lt;span class="w"&gt; &lt;/span&gt;Power&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;PRAM&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;wyłączony&lt;span class="w"&gt; &lt;/span&gt;komputer,&lt;span class="w"&gt; &lt;/span&gt;włączam&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;jak&lt;span class="w"&gt; &lt;/span&gt;usłyszę&lt;span class="w"&gt; &lt;/span&gt;dźwięk&lt;span class="w"&gt; &lt;/span&gt;staru&lt;span class="w"&gt; &lt;/span&gt;trzymam&lt;span class="w"&gt; &lt;/span&gt;Alt+Command+P+R&lt;span class="w"&gt; &lt;/span&gt;aż&lt;span class="w"&gt; &lt;/span&gt;usłyszę&lt;span class="w"&gt; &lt;/span&gt;drugi&lt;span class="w"&gt; &lt;/span&gt;dźwięk&lt;span class="w"&gt; &lt;/span&gt;startu&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;wtedy&lt;span class="w"&gt; &lt;/span&gt;puszczam&lt;span class="o"&gt;)&lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;Nie&lt;span class="w"&gt; &lt;/span&gt;wiem&lt;span class="w"&gt; &lt;/span&gt;czy&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;potrzebne&lt;span class="w"&gt; &lt;/span&gt;ale&lt;span class="w"&gt; &lt;/span&gt;wolałem&lt;span class="w"&gt; &lt;/span&gt;zaczynać&lt;span class="w"&gt; &lt;/span&gt;z&lt;span class="w"&gt; &lt;/span&gt;czystym&lt;span class="w"&gt; &lt;/span&gt;kontem.&lt;span class="w"&gt; &lt;/span&gt;Musiałem&lt;span class="w"&gt; &lt;/span&gt;też&lt;span class="w"&gt; &lt;/span&gt;ponownie&lt;span class="w"&gt; &lt;/span&gt;użyć&lt;span class="w"&gt; &lt;/span&gt;Refinda.&lt;span class="w"&gt;
&lt;/span&gt;Zainstalowałem&lt;span class="w"&gt; &lt;/span&gt;pulseaudio:&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;pulseaudio&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;zainstalowałem:&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;alsa-firmware-loaders&lt;span class="w"&gt; &lt;/span&gt;Reboot&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;pomogło!
&lt;/pre&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="touchpad"&gt;
&lt;h2&gt;TOUCHPAD&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;W /etc/X11/xorg.conf.d dodałem dwa pliki, właściwie to pozostałość po porzednich próbach i spokojnie można oba skonsolidować.&lt;/div&gt;
&lt;div class="line"&gt;W 50-synaptics-clickpad.conf:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
Section "InputClass"
Identifier "touchpad catchall"
Driver "synaptics"
MatchIsTouchpad "on"
# Option "VertScrollDelta" "-111"
# Option "HorizScrollDelta" "-111"
# Option "MinSpeed" "0.5"
# Option "MaxSpeed" "1.0"
# Option "AccelFactor" "0.075"
# Option "LBCornerButton" "8"
# browser "back" btn
# Option "RBCornerButton" "9"
# browser "forward" btn
EndSection
&lt;/pre&gt;
&lt;p&gt;a w 60-synaptics.conf:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
Section "InputClass"
Identifier "touchpad"
Driver "synaptics"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Option "FingerHigh" "50"
Option "TapButton1" "1"
Option "TapButton2" "2"
Option "TapButton3" "3"
Option "RTCornerButton" "0"
Option "RBCornerButton" "0"
Option "LTCornerButton" "0"
Option "LBCornerButton" "0"
Option "MinSpeed" "0.7"
Option "MaxSpeed" "1.7"
Option "SHMConfig" "on"
Option "TapAndDragGesture" "off"
Option "PalmDetect" "on"
Option "PalmMinWidth" "8"
Option "PalmMinz" "200"
EndSection
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Ostatnie 3 linijki mają ogromne znaczenie przy pisaniu na klawiaturze ponieważ "PalmDetect" włącza wykrywanie przypadkowych dotknięć touchpadu przy pisaniu na klawiaturze. Pozostałe dwa to szerokość dotknięcia i siła nacisku.&lt;/div&gt;
&lt;div class="line"&gt;Ustawienia te można obserwować za pomocą narzędzia: evtest.&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
apt-get install evtest evetet /dev/input/event8
&lt;/pre&gt;
&lt;p&gt;(/dev/input8 to u mnie Touchpad)&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="mutt-wole-alpine"&gt;
&lt;h2&gt;MUTT (wolę Alpine)&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Instalacja mutta i konfigurowanie wielu kont. Tu podparłem się doskonałą stroną: &lt;a class="reference external" href="https://www.df7cb.de/blog/2010/Using_multiple_IMAP_accounts_with_Mutt.html%20"&gt;https://www.df7cb.de/blog/2010/Using_multiple_IMAP_accounts_with_Mutt.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;Wszystko pięknie zadziałało.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Do mutta dołożyłem książkę adresową zasysaną z Ownclouda wg. tego przepisu: &lt;a class="reference external" href="https://got-tty.org/mutt-kontakte-aus-owncloud-nutzen"&gt;https://got-tty.org/mutt-kontakte-aus-owncloud-nutzen&lt;/a&gt; (po niemiecku ale wszystko zrozumiałe).&lt;/p&gt;
&lt;p&gt;Oglądanie urli za pomocą linksa albo lynxa:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
apt-get install urlview
&lt;/pre&gt;
&lt;p&gt;Do ~/.muttrc:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
macro pager \cu |urlview\n
&lt;/pre&gt;
&lt;p&gt;Skopiowałem /etc/urlview/system.urlview i /etc/urlview/url_handler.sh lokalnie bo chciałem zmienić kolejność szukanych browserów, a nie chcę ustawiać zmiennej BROWSER.&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="firefox-vimperator-tridactyl-lepszy"&gt;
&lt;h2&gt;FIREFOX + VIMPERATOR (Tridactyl lepszy)&lt;/h2&gt;
&lt;p&gt;Vimperator ma buga: w trybie pełnoekranowym F11 znika statusbar i przestają działać hinty. Rozwiązaniem jest zablokowanie automatycznego&lt;/p&gt;
&lt;p&gt;chowania się statusbaru. W vimperatorze wydajemy komendę:&lt;/p&gt;
&lt;p&gt;:set statuslinevisibility=visible&lt;/p&gt;
&lt;p&gt;i zachowujemy do pliku konfiguracyjnego:&lt;/p&gt;
&lt;p&gt;:mkvimperatorrc&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="xscreensaver"&gt;
&lt;h2&gt;XSCREENSAVER&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Chcę, żeby startował automatycznie po zalogowaniu się do sesji X-ów.&lt;/div&gt;
&lt;div class="line"&gt;Tworzę katalog:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
mkdir ~/.config/systemd/user
&lt;/pre&gt;
&lt;p&gt;a w nim plik: xscreensaver.service z następującą zawartością:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Unit]
Description=XScreenSaver Daemon
[Service]
ExecStart=/usr/bin/xscreensaver --no-splash
[Install]
WantedBy=default.target
&lt;/pre&gt;
&lt;p&gt;Następnie włączam serwis:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl --user enable xscreensaver.service
&lt;/pre&gt;
&lt;p&gt;i uruchamiam:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl --user start xscreensaver.service
&lt;/pre&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="przejscie-na-display-managera-sddm"&gt;
&lt;h2&gt;Przejście na Display Managera: sddm&lt;/h2&gt;
&lt;pre class="code bash literal-block"&gt;
dpkg-reconfigure&lt;span class="w"&gt; &lt;/span&gt;sddm
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;własny temat: &lt;a class="reference external" href="https://jlk.fjfi.cvut.cz/arch/manpages/man/sddm.conf.5"&gt;https://jlk.fjfi.cvut.cz/arch/manpages/man/sddm.conf.5&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;w /etc/sddm.conf dodać wpis:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
[Theme]
Current=debian-paczor
FacesDir=/home/paczor/Pictures/faces
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Tematy są w: /usr/share/sddm/themes/&lt;/div&gt;
&lt;div class="line"&gt;Skopiowałem debian-breeze jako debian-paczor i zmieniam konfigurację jak chcę.&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;Pomocne linki:&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="hibernacja"&gt;
&lt;h2&gt;Hibernacja:&lt;/h2&gt;
&lt;p&gt;Najlepiej zacząć od zminy domyślnej konfiguracji. Uwaga, gdy używałem zamkniętych sterowników Nvidii hibernacja zakończyła się ostatecznie całkowitą rozwałką sytemu. Po przejściu na Intela na razie nie miałem tak tragicznych konsekwencji ale system po zamknięciu klapy laptopa nie przechodził z trybu Suspend w Hibernate. Podejrzewa, że miałem źle skonfigurwane dwa główne pliki. Ale do rzeczy...&lt;/p&gt;
&lt;p&gt;Konfigurujemy dwa pliki:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo vim  /etc/systemd/sleep.conf
sudo vim  /etc/systemd/logind.conf
&lt;/pre&gt;
&lt;p&gt;W sleep.conf zezwalamy zarówno na Suspend, jak i na Hibernate oraz ustalamy po jakim czasie system będący w Suspend przejdzie w Hibernate jeśli nie nastąpi jakieś przerywające uśpienie zdarzenie (u mnie jest to 10 minut):&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Sleep]
AllowSuspend=yes
AllowHibernation=yes
AllowSuspendThenHibernate=yes
#AllowHybridSleep=yes
#SuspendMode=
#SuspendState=mem standby freeze
#HibernateMode=platform shutdown
#HibernateState=disk
#HybridSleepMode=suspend platform shutdown
#HybridSleepState=disk
HibernateDelaySec=10m
&lt;/pre&gt;
&lt;p&gt;Natomiast w pliku logind.conf ustawiamy wybrane tryby i zdarzenia, które wyzwalają te tryby. Zdarzeniami są najczęściej: wciśniecie klawisza/przycisku albo zamknięcie pokrywy laptopa.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
HandlePowerKey=suspend-then-hibernate
HandleSuspendKey=suspend-then-hibernate
HandleHibernateKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate
HandleLidSwitchDocked=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#HoldoffTimeoutSec=30s
IdleAction=suspend-then-hibernate
IdleActionSec=10min
#RuntimeDirectorySize=10%
#RemoveIPC=yes
#InhibitorsMax=8192
#SessionsMax=8192
#UserTasksMax=33%
&lt;/pre&gt;
&lt;p&gt;Przydatne informacje są w manualach:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
man systemd-sleep.conf
man logind.conf
&lt;/pre&gt;
&lt;p&gt;Polecenie uaktualniające po zmianie konfiguracji, może nastąpić uśpienie albo hibernacja - zależnie od wprowadzonych zmian:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo systemctl restart systemd-logind.service
&lt;/pre&gt;
&lt;p&gt;Wyświetlenie statusu obsługi:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo systemctl status systemd-logind.service
&lt;/pre&gt;
&lt;p&gt;U mnie zwraca to:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
â systemd-logind.service - Login Service
   Loaded: loaded (/lib/systemd/system/systemd-logind.service; static; vendor preset: enabled)
   Active: active (running) since Fri 2020-06-12 00:27:31 CEST; 11h ago
     Docs: man:systemd-logind.service(8)
           man:logind.conf(5)
           https://www.freedesktop.org/wiki/Software/systemd/logind
           https://www.freedesktop.org/wiki/Software/systemd/multiseat
 Main PID: 963 (systemd-logind)
   Status: "Processing requests..."
    Tasks: 1 (limit: 4915)
   Memory: 3.2M
   CGroup: /system.slice/systemd-logind.service
           ââ963 /lib/systemd/systemd-logind

Jun 12 00:27:31 eclipse systemd-logind[963]: Watching system buttons on /dev/input/event0 (Lid Switch)
Jun 12 00:27:31 eclipse systemd-logind[963]: Watching system buttons on /dev/input/event2 (Sleep Button)
Jun 12 00:27:31 eclipse systemd-logind[963]: Watching system buttons on /dev/input/event7 (Apple Inc. Apple Internal Keyboard / Trackpad)
Jun 12 00:27:31 eclipse systemd[1]: Started Login Service.
&lt;/pre&gt;
&lt;p&gt;Jak widać obserwowane są:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Lid Switch - czyli klapa lapa&lt;/li&gt;
&lt;li&gt;Sleep Button - czyli główny wyłącznik&lt;/li&gt;
&lt;li&gt;Apple Internal Keyboard/Trackpad - klawiatura i trackpad, po to żeby wybudzić z uśpienia czyli przerwać odliczanie do hibernacji (to ustawione wcześniej 10 minut)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Polecenie wyłączające suspend i hibernację:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
&lt;/pre&gt;
&lt;p&gt;To raczej ostateczność: &lt;a class="reference external" href="https://itsfoss.com/ubuntu-close-lid-suspend/"&gt;https://itsfoss.com/ubuntu-close-lid-suspend/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="vpn"&gt;
&lt;h2&gt;VPN:&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://site.elastichosts.com/blog/linux-l2tpipsec-vpn-client/"&gt;https://site.elastichosts.com/blog/linux-l2tpipsec-vpn-client/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="xmonad"&gt;
&lt;h2&gt;Xmonad:&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://xiangji.me/2018/11/19/my-xmonad-configuration/"&gt;https://xiangji.me/2018/11/19/my-xmonad-configuration/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy-z-x"&gt;
&lt;h2&gt;problemy z X?&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.debian.org/Xsession"&gt;https://wiki.debian.org/Xsession&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy-z-dzwiekiem-przez-displayport"&gt;
&lt;h2&gt;problemy z dźwiękiem przez DisplayPort?&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unix.stackexchange.com/questions/88118/alsa-how-to-temporarily-change-the-output-device"&gt;https://unix.stackexchange.com/questions/88118/alsa-how-to-temporarily-change-the-output-device&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="touchpad-i-dispad"&gt;
&lt;h2&gt;Touchpad i dispad&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://int3ractive.com/2018/09/make-the-best-of-MacBook-touchpad-on-Ubuntu.html"&gt;https://int3ractive.com/2018/09/make-the-best-of-MacBook-touchpad-on-Ubuntu.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problem-z-xscreensaver"&gt;
&lt;h2&gt;Problem z xscreensaver&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bbs.archlinux.org/viewtopic.php?pid=1218771#p1218771"&gt;https://bbs.archlinux.org/viewtopic.php?pid=1218771#p1218771&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="systemd"&gt;
&lt;h2&gt;Systemd&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://www.dobreprogramy.pl/mariushko/Poradnik-systemd-cz.-1,67627.html"&gt;https://www.dobreprogramy.pl/mariushko/Poradnik-systemd-cz.-1,67627.html&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/index.php/Systemd/User"&gt;https://wiki.archlinux.org/index.php/Systemd/User&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="rozne-porady"&gt;
&lt;h2&gt;Różne porady&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://martinralbrecht.wordpress.com/2014/05/03/debiantesting-on-macbook-pro-113/"&gt;https://martinralbrecht.wordpress.com/2014/05/03/debiantesting-on-macbook-pro-113/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://apfelkraut.org/2017/06/howto-debian-gnulinux-stretch-as-dual-boot-on-a-macbookpro113/"&gt;https://apfelkraut.org/2017/06/howto-debian-gnulinux-stretch-as-dual-boot-on-a-macbookpro113/&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://blog.sviluppoweb.eu/2014/02/20/debian-on-macbook-pro-retina-15/"&gt;https://blog.sviluppoweb.eu/2014/02/20/debian-on-macbook-pro-retina-15/&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="refind"&gt;
&lt;h2&gt;reFind&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/0xbb/apple_set_os.efi"&gt;https://github.com/0xbb/apple_set_os.efi&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="rofi-i-skrypty"&gt;
&lt;h2&gt;rofi i skrypty&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;w ~/bin/ (przy okazji plugin do VIM-a do robienia tabelek)&lt;/div&gt;
&lt;div class="line"&gt;rofi do VPN (skrypt wyświetlający połączone VPN-y),&lt;/div&gt;
&lt;div class="line"&gt;rofi do Mikrotika&lt;/div&gt;
&lt;div class="line"&gt;rofi do wyświetlania Helpa&lt;/div&gt;
&lt;div class="line"&gt;rofi do qalc (opis qalc)&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="opis-khal-vdirsyncera-oraz-keyring"&gt;
&lt;h2&gt;Opis khal, vdirsyncera oraz keyring.&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;alias khali='khalinteractive'&lt;/div&gt;
&lt;div class="line"&gt;keyring set CalDAV paczor&lt;/div&gt;
&lt;div class="line"&gt;podaję hasło&lt;/div&gt;
&lt;div class="line"&gt;a pobranie: keyring get CalDAV paczor&lt;/div&gt;
&lt;div class="line"&gt;w .vdirsyncer/config załatwia to potem linia:&lt;/div&gt;
&lt;div class="line"&gt;password.fetch = ["command", "keyring", "get", "CalDAV", "paczor"]&lt;/div&gt;
&lt;div class="line"&gt;i już nie pyta o hasło&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="mariadb"&gt;
&lt;h2&gt;MariaDB&lt;/h2&gt;
&lt;p&gt;po "sudo reboot" bardzo długo się zamyka, wyświetlając komunikat: â€œA stop job is running to ...â€?. Pomaga to:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;sudo &lt;span class="pre"&gt;dpkg-reconfigure&lt;/span&gt; tzdata&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="nextcloud-client"&gt;
&lt;h2&gt;Nextcloud client:&lt;/h2&gt;
&lt;pre class="code bash literal-block"&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/sources.list.d/nextcloud-devs-ubuntu-client-groovy.list&lt;span class="w"&gt;
&lt;/span&gt;deb&lt;span class="w"&gt; &lt;/span&gt;http://ppa.launchpad.net/nextcloud-devs/client/ubuntu&lt;span class="w"&gt; &lt;/span&gt;groovy&lt;span class="w"&gt; &lt;/span&gt;main&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;#deb-src http://ppa.launchpad.net/nextcloud-devs/client/ubuntu groovy main
&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;--keyserver&lt;span class="w"&gt; &lt;/span&gt;keyserver.ubuntu.com&lt;span class="w"&gt; &lt;/span&gt;--recv&lt;span class="w"&gt; &lt;/span&gt;60EE47FBAD3DD469&lt;span class="w"&gt;
&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;gpg&lt;span class="w"&gt; &lt;/span&gt;--export&lt;span class="w"&gt; &lt;/span&gt;--armor&lt;span class="w"&gt; &lt;/span&gt;60EE47FBAD3DD469&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-key&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="virtualbox"&gt;
&lt;h2&gt;VirtualBox:&lt;/h2&gt;
&lt;pre class="code html literal-block"&gt;
cat /etc/apt/sources.list.d/virtualbox.list
deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian buster contrib

wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install virtualbox-6.1
wget https://download.virtualbox.org/virtualbox/6.1.6/Oracle_VM_VirtualBox_Extension_Pack-6.1.6.vbox-extpack
sudo virtualbox Downloads/Oracle_VM_VirtualBox_Extension_Pack-6.1.6.vbox-extpack
sudo usermod -a -G vboxusers $USER
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="partycje-apfs"&gt;
&lt;h2&gt;Partycje APFS:&lt;/h2&gt;
&lt;pre class="code html literal-block"&gt;
https://linuxnewbieguide.org/how-to-mount-macos-apfs-disk-volumes-in-linux
&lt;/pre&gt;
&lt;p&gt;APFS z dysku: &lt;a class="reference external" href="https://github.com/sgan81/apfs-fuse"&gt;https://github.com/sgan81/apfs-fuse&lt;/a&gt;&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
sudo apt install fuse libfuse3-dev bzip2 libbz2-dev cmake git libattr1-dev zlib1g-dev
git clone https://github.com/sgan81/apfs-fuse.git
cd apfs-fuse
git submodule init
git submodule update
mkdir build
cd build
cmake ..
# jeśli chcesz zmienić ustawienia to:
# sudo apt install cmake-curses-gui
# ccmake .
make
sudo make install
sudo cp apfsutil /usr/local/bin
# wylistowanie dostępnych partycji i nazw woluminów
sudo apfsutil /dev/sdc2

Volume 4 FD331FC1-1327-45D7-8538-F6B19B5139E6
---------------------------------------------
Role:               No specific role
Name:               MEDIA-torba (Case-insensitive)
Capacity Consumed:  18652901376 Bytes
FileVault:          No

Volume 5 AA7F7F57-D871-4870-A6C9-CAC003F57157
---------------------------------------------
Role:               No specific role
Name:               VIRT-torba (Case-insensitive)
Capacity Consumed:  174489903104 Bytes
FileVault:          No


i montując należy podać nazwę voluminu, np. żeby zamontować volume 5:
sudo apfs-fuse -o uid=1000,gid=1000,allow_other -v 5 /dev/sdc2 /mnt/torba
# opcje po -o, pozwalają na dostęp userom
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="przelaczenie-na-zintegrowana-karte-intel"&gt;
&lt;h2&gt;Przełączenie na zintegrowaną kartę Intel:&lt;/h2&gt;
&lt;p&gt;Dlaczego w ogóle warto zawracać sobie tym głowę? Po pierwsze, gdy używam opesource'owego sterownika do kart Nvidii - Nouveau - nie działa hibernacja. A właściwie działa ale po wyjściu z zamrożenia użycie procesora skacze go ponad 90%, kernel zaś pluje taką ilością ostrzeżeń, że po kilku minutach syslog może spuchnąć do wielu gigabajtów.&lt;/p&gt;
&lt;p&gt;Po drugie, po przejściu na komercyjne sterowniki Nvidii traci się możliwość przejścia z X-ów do konsoli.&lt;/p&gt;
&lt;p&gt;Po trzecie, Nvidia na komercyjnych sterownikach żre mnóstwo prądu, skracając czas działania na baterii&lt;/p&gt;
&lt;p&gt;w pliku /boot/efi/EFI/refind/refind.conf dodaj linię:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
spoof_osx_version 10.9
&lt;/pre&gt;
&lt;p&gt;która sprawia, że Macbook "myśli", że bootuje w macOS-ie.&lt;/p&gt;
&lt;p&gt;Pobierz gpu-switch ze strony: &lt;a class="reference external" href="https://github.com/0xbb/gpu-switch"&gt;https://github.com/0xbb/gpu-switch&lt;/a&gt;. Użyj go z przełącznikiem "-i":&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
gpu-switch -i
&lt;/pre&gt;
&lt;p&gt;Spowoduje to przełączenie na kartę Intela. Teraz reboot.&lt;/p&gt;
&lt;p&gt;Zainstaluj pakiet: xserver-xorg-video-intel i gotowe.&lt;/p&gt;
&lt;p&gt;A teraz jazda bez trzymanki czyi próba wyłączenia Nvidii, mnie się nie udaje, mam błędy kernela i kończy się kompletnym zwisem. Lecz jeśli jej nie wyłączę to wszystko ładnie hasa.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Opis i potrzebny kod są tu: &lt;a class="reference external" href="https://wiki.archlinux.org/index.php/MacBookPro10,x#Graphics_2"&gt;https://wiki.archlinux.org/index.php/MacBookPro10,x#Graphics_2&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;oraz tu: &lt;a class="reference external" href="https://wiki.archlinux.org/index.php/MacBookPro11,x#Graphics"&gt;https://wiki.archlinux.org/index.php/MacBookPro11,x#Graphics&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="hidpi"&gt;
&lt;h2&gt;HiDPI&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/index.php/HiDPI"&gt;https://wiki.archlinux.org/index.php/HiDPI&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="tlpd-energia"&gt;
&lt;h2&gt;TLPd (energia)&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://linrunner.de/tlp/"&gt;https://linrunner.de/tlp/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bzdurki"&gt;
&lt;h2&gt;Bzdurki&lt;/h2&gt;
&lt;p&gt;Fortunki: &lt;a class="reference external" href="https://github.com/maxieds/math-fortune-mod"&gt;https://github.com/maxieds/math-fortune-mod&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cool Rerto Term: &lt;a class="reference external" href="https://github.com/Swordfish90/cool-retro-term"&gt;https://github.com/Swordfish90/cool-retro-term&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="rozne-porady-2"&gt;
&lt;span id="rozne-porady-1"&gt;&lt;/span&gt;&lt;h2&gt;Różne porady&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://int3ractive.com/2019/12/things-to-do-after-installing-ubuntu-mate.html"&gt;https://int3ractive.com/2019/12/things-to-do-after-installing-ubuntu-mate.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="an2linux"&gt;
&lt;h2&gt;an2linux&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Czyli powiadomienia z Androida na laptopie: &lt;a class="reference external" href="https://github.com/rootkiwi/an2linuxserver"&gt;https://github.com/rootkiwi/an2linuxserver&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;instalacja w systemd: &lt;a class="reference external" href="https://github.com/rootkiwi/an2linuxserver/tree/master/init/systemd-user"&gt;https://github.com/rootkiwi/an2linuxserver/tree/master/init/systemd-user&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy-z-przewaniami"&gt;
&lt;h2&gt;Problemy z przewaniami&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot"&gt;https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.google.com/search?client=ubuntu&amp;amp;channel=fs&amp;amp;q=linux+disable+acpi+interrrupt&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;https://www.google.com/search?client=ubuntu&amp;amp;channel=fs&amp;amp;q=linux+disable+acpi+interrrupt&amp;amp;ie=utf-8&amp;amp;oe=utf-8&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Shitz"></category></entry><entry><title>Debian na Macbooku Pro Late 2013 cz.2 (xorg)</title><link href="https://scyzoryk.fubar.pl/debian_na_macbooku_cz2.html" rel="alternate"></link><published>2020-12-08T00:56:00+01:00</published><updated>2020-12-08T00:56:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-12-08:/debian_na_macbooku_cz2.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Niniejszy artykuł powstał ponad rok temu i przeleżał wszystkie te mesiące w postaci szkicu, uzupełnianego o nowe pozycje.&lt;/p&gt;
&lt;p&gt;Ta część opisuje instalację Xorg.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="xorg"&gt;
&lt;span id="kt-adv-heading-28a0f1-6b"&gt;&lt;/span&gt;&lt;h2&gt;Xorg&lt;/h2&gt;
&lt;div class="section" id="nvidia"&gt;
&lt;span id="kt-adv-heading-7d2f03-54"&gt;&lt;/span&gt;&lt;h3&gt;Nvidia&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Xorg działało od razu na driverze nouveau czyli opensourcowym sterowniku dla Nvidii.&lt;/div&gt;
&lt;div class="line"&gt;Zachciało mi się jednak oryginalnego sterownika …&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Niniejszy artykuł powstał ponad rok temu i przeleżał wszystkie te mesiące w postaci szkicu, uzupełnianego o nowe pozycje.&lt;/p&gt;
&lt;p&gt;Ta część opisuje instalację Xorg.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;div class="section" id="xorg"&gt;
&lt;span id="kt-adv-heading-28a0f1-6b"&gt;&lt;/span&gt;&lt;h2&gt;Xorg&lt;/h2&gt;
&lt;div class="section" id="nvidia"&gt;
&lt;span id="kt-adv-heading-7d2f03-54"&gt;&lt;/span&gt;&lt;h3&gt;Nvidia&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Xorg działało od razu na driverze nouveau czyli opensourcowym sterowniku dla Nvidii.&lt;/div&gt;
&lt;div class="line"&gt;Zachciało mi się jednak oryginalnego sterownika. Mimo wielu prób nie kopilowały mi się moduły jądra. Podczas kompilacji wyskakiwał błąd, że brak jest pliku include/generated/autoconf.h, chociaż plik jak najbardziej był na właściwym miejscu.&lt;/div&gt;
&lt;div class="line"&gt;Nie chciało mi się kopać z koniem, inni też się wymęczyli, więc użyłem repozytorium jessie-backports (wg.: &lt;a class="reference external" href="https://wiki.debian.org/NvidiaGraphicsDrivers#jessie-352"&gt;https://wiki.debian.org/NvidiaGraphicsDrivers#jessie-352&lt;/a&gt;):&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;do /etc/apt/sources.list dodałem:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
deb&lt;span class="w"&gt; &lt;/span&gt;http://httpredir.debian.org/debian&lt;span class="w"&gt; &lt;/span&gt;jessie-backports&lt;span class="w"&gt; &lt;/span&gt;main&lt;span class="w"&gt; &lt;/span&gt;contrib&lt;span class="w"&gt; &lt;/span&gt;non-free
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
apt-get&lt;span class="w"&gt; &lt;/span&gt;update
&lt;/pre&gt;
&lt;pre class="code html literal-block"&gt;
apt-get install -t jessie-backports nvidia-driver
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Trzeba usunąć /etc/X11/xorg.conf, bez niego server X używa domyślnych ustawień i działa prawidłowo.&lt;/div&gt;
&lt;div class="line"&gt;Na konfigurację przyjdzie jeszcze czas...&lt;/div&gt;
&lt;div class="line"&gt;Przerzuciłem się na zamknięty sterownik od NVidii (ten z .run na końcu). Jest OK ale nadal nie działa przechodzenie między X-ami, a konsolą. Podobno ten trick załatwia sprawę:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Aktualizacja:&lt;/em&gt; niestety, to nie działa.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="xscreensaver"&gt;
&lt;h2&gt;XSCREENSAVER&lt;/h2&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Chcę, żeby startował automatycznie po zalogowaniu się do sesji X-ów.&lt;/div&gt;
&lt;div class="line"&gt;Tworzę katalog:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
mkdir ~/.config/systemd/user
&lt;/pre&gt;
&lt;p&gt;a w nim plik: xscreensaver.service z następującą zawartością:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
[Unit]
Description=XScreenSaver Daemon
[Service]
ExecStart=/usr/bin/xscreensaver --no-splash
[Install]
WantedBy=default.target
&lt;/pre&gt;
&lt;p&gt;Następnie włączam serwis:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl --user enable xscreensaver.service
&lt;/pre&gt;
&lt;p&gt;i uruchamiam:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
systemctl --user start xscreensaver.service
&lt;/pre&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="przejscie-na-display-managera-sddm"&gt;
&lt;h2&gt;Przejście na Display Managera: sddm&lt;/h2&gt;
&lt;pre class="code bash literal-block"&gt;
dpkg-reconfigure&lt;span class="w"&gt; &lt;/span&gt;sddm
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;własny temat: &lt;a class="reference external" href="https://jlk.fjfi.cvut.cz/arch/manpages/man/sddm.conf.5"&gt;https://jlk.fjfi.cvut.cz/arch/manpages/man/sddm.conf.5&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;w /etc/sddm.conf dodać wpis:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code html literal-block"&gt;
[Theme]
Current=debian-paczor
FacesDir=/home/paczor/Pictures/faces
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Tematy są w: /usr/share/sddm/themes/&lt;/div&gt;
&lt;div class="line"&gt;Skopiowałem debian-breeze jako debian-paczor i zmieniam konfigurację jak chcę.&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils"/&gt;
&lt;/div&gt;
&lt;div class="section" id="xmonad"&gt;
&lt;h2&gt;Xmonad:&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://xiangji.me/2018/11/19/my-xmonad-configuration/"&gt;https://xiangji.me/2018/11/19/my-xmonad-configuration/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy-z-x"&gt;
&lt;h2&gt;problemy z X?&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.debian.org/Xsession"&gt;https://wiki.debian.org/Xsession&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problem-z-xscreensaver"&gt;
&lt;h2&gt;Problem z xscreensaver&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bbs.archlinux.org/viewtopic.php?pid=1218771#p1218771"&gt;https://bbs.archlinux.org/viewtopic.php?pid=1218771#p1218771&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="przelaczenie-na-zintegrowana-karte-intel"&gt;
&lt;h2&gt;Przełączenie na zintegrowaną kartę Intel:&lt;/h2&gt;
&lt;p&gt;Dlaczego w ogóle warto zawracać sobie tym głowę? Po pierwsze, gdy używam opesource'owego sterownika do kart Nvidii - Nouveau - nie działa hibernacja. A właściwie działa ale po wyjściu z zamrożenia użycie procesora skacze go ponad 90%, kernel zaś pluje taką ilością ostrzeżeń, że po kilku minutach syslog może spuchnąć do wielu gigabajtów.&lt;/p&gt;
&lt;p&gt;Po drugie, po przejściu na komercyjne sterowniki Nvidii traci się możliwość przejścia z X-ów do konsoli.&lt;/p&gt;
&lt;p&gt;Po trzecie, Nvidia na komercyjnych sterownikach żre mnóstwo prądu, skracając czas działania na baterii&lt;/p&gt;
&lt;p&gt;w pliku /boot/efi/EFI/refind/refind.conf dodaj linię:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
spoof_osx_version 10.9
&lt;/pre&gt;
&lt;p&gt;która sprawia, że Macbook "myśli", że bootuje w macOS-ie.&lt;/p&gt;
&lt;p&gt;Pobierz gpu-switch ze strony: &lt;a class="reference external" href="https://github.com/0xbb/gpu-switch"&gt;https://github.com/0xbb/gpu-switch&lt;/a&gt;. Użyj go z przełącznikiem "-i":&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
gpu-switch -i
&lt;/pre&gt;
&lt;p&gt;Spowoduje to przełączenie na kartę Intela. Teraz reboot.&lt;/p&gt;
&lt;p&gt;Zainstaluj pakiet: xserver-xorg-video-intel i gotowe.&lt;/p&gt;
&lt;p&gt;A teraz jazda bez trzymanki czyi próba wyłączenia Nvidii, mnie się nie udaje, mam błędy kernela i kończy się kompletnym zwisem. Lecz jeśli jej nie wyłączę to wszystko ładnie hasa.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Opis i potrzebny kod są tu: &lt;a class="reference external" href="https://wiki.archlinux.org/index.php/MacBookPro10,x#Graphics_2"&gt;https://wiki.archlinux.org/index.php/MacBookPro10,x#Graphics_2&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;oraz tu: &lt;a class="reference external" href="https://wiki.archlinux.org/index.php/MacBookPro11,x#Graphics"&gt;https://wiki.archlinux.org/index.php/MacBookPro11,x#Graphics&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="hidpi"&gt;
&lt;h2&gt;HiDPI&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.archlinux.org/index.php/HiDPI"&gt;https://wiki.archlinux.org/index.php/HiDPI&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="problemy-z-przerwaniami"&gt;
&lt;h2&gt;Problemy z przerwaniami&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot"&gt;https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot&lt;/a&gt;&lt;/p&gt;
&lt;div class="float wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler docutils container"&gt;
&lt;div class="wp-block-embed-wrapper docutils container"&gt;
&lt;a class="reference external" href="https://www.google.com/search?client=ubuntu&amp;amp;channel=fs&amp;amp;q=linux+disable+acpi+interrrupt&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;https://www.google.com/search?client=ubuntu&amp;amp;channel=fs&amp;amp;q=linux+disable+acpi+interrrupt&amp;amp;ie=utf-8&amp;amp;oe=utf-8&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Macbook"></category></entry><entry><title>A to bateria</title><link href="https://scyzoryk.fubar.pl/1273.html" rel="alternate"></link><published>2020-12-01T11:44:00+01:00</published><updated>2020-12-01T11:44:00+01:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2020-12-01:/1273.html</id><summary type="html">&lt;p&gt;Od kilku tygodni mam problem z klawiszami w Macbooku. Początkowo myślałem, że mam problem z palcami, który pochodzi z problemów z kręgosłupem. No ale na szczęście nie. Więc zacząłem uważać, że tu chodzi o sprzęt, no bo skoro zarówno w Linuksie, jak i w macOS-ie mam ten sam problem z …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Od kilku tygodni mam problem z klawiszami w Macbooku. Początkowo myślałem, że mam problem z palcami, który pochodzi z problemów z kręgosłupem. No ale na szczęście nie. Więc zacząłem uważać, że tu chodzi o sprzęt, no bo skoro zarówno w Linuksie, jak i w macOS-ie mam ten sam problem z niedziałającymi czasem klawiszami "r, t, y, u, i, o", to musi znaczyć że dzieje się coś złego ze sprzętem.&lt;/p&gt;
&lt;p&gt;Pomyślałem, że nie zaszkodzi rozebrać maczka i trochę go obejrzeć, a przy okazji przeczyścić. Ale to nie pomogło. No więc to albo uszkodzenie samej klawiatury albo... to gorzej... kontrolera czyli niestety płyty głównej.&lt;/p&gt;
&lt;p&gt;Ale dosłownie przed chwilą wpadłem na pomysł, że problem może się brać z programu, który blokuje mi iiiiiiiiiiiiiiiooooooo ooooiuuu iu iuiu iu i uiuoioioi oioi uuuoo ioioioioi iuiuiiuoio ppoooooiiiiii uiiuiuiuiuiuiuiuiuiui o właśnie znowu się to stało w trakcie pisania tego wpisu w Firefoksie. Wracam więc do pisania. Wpadłem na pomysł, że to przez program używany w obu sysecham korych używam na Macbooku. No i padło na Firefksa. znw zaczn m pzes&lt;/p&gt;
&lt;p&gt;Dopisek po kilku latach: to  byla spuchnięta bateria, która uszkodziła klawiaturę.&lt;/p&gt;
</content><category term="Shitz"></category></entry><entry><title>Ile pieniędzy zjada drukarka?</title><link href="https://scyzoryk.fubar.pl/ile_pieniedzy_zjada_drukarka.html" rel="alternate"></link><published>2020-11-20T09:17:00+01:00</published><updated>2020-11-20T09:17:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-11-20:/ile_pieniedzy_zjada_drukarka.html</id><summary type="html">&lt;p&gt;Zadałem sobie kiedyś pytanie ile prądu, czyli też pieniędzy, pożera duża drukarka firmowa. Konkretnie chodziło o model WorkCenter 7245.&lt;/p&gt;
&lt;p&gt;Z wirtualnej tabliczki znamionowej odczytałem, że drukarka posiada następujące parametry:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Pobór mocy w czasie pracy &amp;lt; 1080 watów&lt;/li&gt;
&lt;li&gt;Pobór w stanie oczekiwania &amp;lt; 200 watów&lt;/li&gt;
&lt;li&gt;Niski pobór mocy &amp;lt; 85 watów&lt;/li&gt;
&lt;li&gt;Tryb uśpienia &amp;lt; 10 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Zadałem sobie kiedyś pytanie ile prądu, czyli też pieniędzy, pożera duża drukarka firmowa. Konkretnie chodziło o model WorkCenter 7245.&lt;/p&gt;
&lt;p&gt;Z wirtualnej tabliczki znamionowej odczytałem, że drukarka posiada następujące parametry:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Pobór mocy w czasie pracy &amp;lt; 1080 watów&lt;/li&gt;
&lt;li&gt;Pobór w stanie oczekiwania &amp;lt; 200 watów&lt;/li&gt;
&lt;li&gt;Niski pobór mocy &amp;lt; 85 watów&lt;/li&gt;
&lt;li&gt;Tryb uśpienia &amp;lt; 10 watów&lt;/li&gt;
&lt;li&gt;Podgrzewanie trwa 70 sekund&lt;/li&gt;
&lt;li&gt;Wyjście ze stanu Niskiego poboru trwa 30 sekund (maksymalnie)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Urządzenie drukuje 40 stron na minutę, co daje 1,5 strony na sekundę.&lt;/p&gt;
&lt;p&gt;Z logów urządzenia znam dzienne obciążenie pracą - jest średnio 107 stron A4.&lt;/p&gt;
&lt;p&gt;Dziennie 160,5 sekund drukarka ciągnie 1080 W czyli 173kW w ciągu dnia.&lt;/p&gt;
</content><category term="sprzęt"></category></entry><entry><title>Zostałeś automatycznie zgłoszony!</title><link href="https://scyzoryk.fubar.pl/zostales-automatycznie-zgloszony.html" rel="alternate"></link><published>2020-11-08T20:09:00+01:00</published><updated>2020-11-08T20:09:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-11-08:/zostales-automatycznie-zgloszony.html</id><summary type="html">&lt;p&gt;Od ponad 5 lat mam do czynienia, zawodowo, z automatycznym rozpoznawaniem tablic rejestracyjnych, w skrócie ALPR (Automatic License Plate Readers). Jeszcze parę lat temu klientami firm związanych z ALPR byli posiadacze parkingów czy właściciele domów towarowych. Głównie chodziło o automatyczny dostęp do miejsc postojowych. Ostatnio, klientami stają się osoby prywatne …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Od ponad 5 lat mam do czynienia, zawodowo, z automatycznym rozpoznawaniem tablic rejestracyjnych, w skrócie ALPR (Automatic License Plate Readers). Jeszcze parę lat temu klientami firm związanych z ALPR byli posiadacze parkingów czy właściciele domów towarowych. Głównie chodziło o automatyczny dostęp do miejsc postojowych. Ostatnio, klientami stają się osoby prywatne, które działając z dobrych pobudek, nieświadomie OGRANICZAJĄ WŁASNĄ i CUDZĄ„ WOLNOŚĆ.&lt;/p&gt;
&lt;p&gt;Jak każda technologia, ALPR w ciągu ostatnich lat rozwinęła się niesamowicie - głównie za sprawą miniaturyzacji i, oczywiście, śmiertelnego dla świata białego człowieka, szaleńczego trendu przenoszenia produkcji do Azji. Sprzęt, wytwarzany przez żółtoskórych niewolników tzw. Zachodu i, pamiętajmy, KOMUNISTYCZNEGO rezimu staniał tak bardzo, że kupić go może właściwie każdy (my też ustawiliśmy się w tej kolejce).&lt;/p&gt;
&lt;p&gt;W zaraniu tej technologii używaliśmy dedykowanych kamer i software'u. Kamera rejestrowała obraz, a software, zainstalowany na silnym Pececie, analizował ten obraz i za pomocą OCR (Optical Character Recognition) zgadywał poszczególne znaki tablicy.&lt;/p&gt;
&lt;p&gt;O technice OCR popełniłem w 2004 roku &lt;a class="reference external" href="https://archiv.linuxsoft.cz/pl/article.php?id_article=470"&gt;artykuł dla portalu Linuxsoft.cz&lt;/a&gt;. O dziwo, strona wciąż istnieje lecz w moim artykule brak już obrazków, postanowiłem więc &lt;a class="reference external" href="/ocr-w-linuksie-raport-subiektywny.html"&gt;odtworzyć go tu, na scyzoryku&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Upowszechnienie się &lt;a class="reference external" href="https://www.wikiwand.com/pl/Procesor_sygna%C5%82owy"&gt;procesorów sygnałowych&lt;/a&gt; spowodowało pojawienie specjalizowanych urządzeń i PeCet z zainstalowanym programem skurczył się i zamienił w czarne pudełko rozmiarów dwóch paczek papierosów lub specjalizowaną kartę na złączu PCI.&lt;/p&gt;
&lt;p&gt;W końcu, i jest to dzisiejszy stan rzeczy, całą robotę związaną z ALPR "odwala" sama kamera. Koszt takiej kamery spada i w 2020 roku wynosi ok. 2000 złotych. Na zakup mogą już pozwolić sobie nie tylko służby, jak policja czy straż, ale np. spółdzielnie mieszkaniowe czy wspólnoty, a nawet indywidualne osoby.&lt;/p&gt;
&lt;p&gt;Kamera z rozpoznawaniem twarzy oraz jej atrybutów (okulary, broda, zasłonięcie twarzy, wiek, płeć, nastrój) to koszt tylko 800 złotych.&lt;/p&gt;
&lt;p&gt;Amerykańskie dane, bo tych jest najwięcej, pokazują że technika ALPR stosowana jest w sektorze prywatnym ze szlachetnych pobudek ale jak mówi przysłowie: piekło wybrukowane jest dobrymi chęciami. Stowarzyszenia mieszkańców w USA instalują kamery ALPR do kontrolowania pojazdów wjeżdżających na teren osiedla - zapewne chodzi tu o automatyczne otwieranie bramek czy wjazdów do garaży - oraz do podniesienia bezpieczeństwa w nadzorowanej okolicy.&lt;/p&gt;
&lt;p&gt;Audyty przeprowadzone w Kaliforni i stanie Vermont wykazały, że systemy ALPR są bardzo często używane z naruszeniem prawa do prywatności. Dane o tablicach rejestracyjnych samochodów przejeżdżających w pobliżu kamer mogą być nawet dostępne publicznie!&lt;/p&gt;
&lt;p&gt;Dlaczego to tak ważne? Wyobraźmy sobie, że przejeżdżaliśmy przez teren z zainstalowanymi kamerami ALPR, zupełnie nieświadomi że dokonano tam jakiegoś groźnego przestępstwa. Ponieważ nasz przejazd został zarejestrowany, a tablice rozpoznane, możemy stać się obiektem zainteresowania policji. Może dojść do zatrzymania, a przecież to nigdy nie jest przyjemna sprawa, zwłaszcza gdy zostaniemy zatrzymani z całą rodziną, jak &lt;a class="reference external" href="https://gizmodo.com/cops-terrorize-black-family-but-blame-license-plate-rea-1844602731"&gt;stało się w Colorado&lt;/a&gt;, gdzie system omyłkowo uznał samochód za skradziony.&lt;/p&gt;
&lt;p&gt;To może skrajny przypadek ale wcale nie taki niemożliwy jak się wydaje. Wiem o czym piszę, gdyż podczas instalacji systemów ALPR, muszę pamiętać o ograniczeniu ich zasięgu gdyż z łatwością "łapią" tablice przejeżdżających przez okolicę pojazdów.&lt;/p&gt;
&lt;p&gt;Prywatnych kamer ALPR będzie coraz więcej i z pewnością będą rejestrować coraz więcej danych. Znając niefrasobliwość, wynikającą z niewiedzy, osób instalujących kamery na swoich podwórkach, mogę ze 100% pewnością napisać, że dane te prędzej lub później trafią w niepowołane ręce.&lt;/p&gt;
&lt;p&gt;Pół biedy gdy będzie to tylko zazdrosny sąsiad, gorzej gdy np. częstotliwość i czas parkowania poznają złodzieje planujący skok na dom. Nawet nie chcę myśleć co będzie w przypadku osób niewygodnych dla rządzącej frakcji politycznej czy ideologicznej.&lt;/p&gt;
&lt;p&gt;Niestety przyszłość już nastała i wygląda bardzo źle. Systemy ALPR potrafią rozpoznawać pojazd nie tylko po numerach rejestracji. Możliwe jest rozpoznanie oraz identyfikacja pojazdu po korozji czy wgnieceniach na nadwoziu.&lt;/p&gt;
&lt;p&gt;Nie wyobrażam sobie sytuacji podobnej do tej o jakiej opowiadał na swoim vlogu mieszkający w Szwajcarii Gynvael Coldwind: włączasz w domu odkurzacz po określonej godzinie i do twoich drzwi puka policja ściągnięta przez hiper-praworządnego obywatela.&lt;/p&gt;
&lt;p&gt;W powyższym przypadku mamy jeszcze do czynienia z reakcją człowieka i pewnym zakresem elastyczności, w przyszłości zły stan naszego samochodu zgłosi automatycznie nieczuła kamera nieznanego człowieka.&lt;/p&gt;
&lt;p&gt;Brrrr!&lt;/p&gt;
</content><category term="Wypociny"></category><category term="bezpieczeństwo"></category></entry><entry><title>[Encrypted] Jak mnie w to wciągnięto?</title><link href="https://scyzoryk.fubar.pl/jak-mnie-w-to-wciagnieto.html" rel="alternate"></link><published>2020-11-04T10:00:00+01:00</published><updated>2020-11-04T10:00:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-11-04:/jak-mnie-w-to-wciagnieto.html</id><summary type="html">Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;H5aHO4C/8Pt2wsySmi1hGQ==;E8U+A+QN/OKcg0ktWmfblY0WYLL6gr1t4NsRUIS1U7mFCS6/Z6LVtFRR6tBGgHaG29xkzZlzTr84peiBrjpqbVDcDOBl4fbD/WXnL/BggAp/o2fAzmuseuXXBuGDexcJ9h0lBAWLVrbmNHeD32+WhXBBv0h4qtx1tI8O4TdePGEijpGuH9VvTWSASpKpmfu4HDJc3hebiyxwrf8z9lqIE57GyZsfpellUkJlm56i5l7RPlnygHkzqDevjCmkQboCzDg5Yi5ZvzV8HN8tN8f20WxN95EeYoOlbufLEkVG4VPk1MSxrDCT+TLmNjtARfbGQbofqlURG2u+sVvsFtxpwwzrTWDuNY+m3QOuOwli7A00D12CwMZ3cdG/C5mO2iiMBqyM8CE9CJWf75WNk4kyRsQr2uNpq5ksl7oZTse6C+hzLIZbPO80/Rtc300K8hThhszjctGTQ4nu4JZuh2e0SIWbgPlwV79c66aXnaU/Kn4zqpr/dsraiQUE8xkxf24e1eJmlLkGDE9qXdwuYcUJAL+wRPQDmX4IPn9ip8QNRx3lBkpnU6UvVFzimYYybGawTDj+MtNp+rux1Sx/0pQ9/fYFRMPCwPx+ka3LRcMLX2Rzn/UNZsFyE5JSNhI6LP56NwLgNnzMExXLp9xiGgjP2YvjMiMrIbRir6dW2kC/QAqkCA/fiy2CvxjsBzeuMhHZ8xPoYgPFZ4aZFe+iB2gAGXHkqh7mI2MZFF4S+RnHwFhKDNFjs/2tqJS0dhWw4kR/1fzL8oRjPqk/vvfMfkGZ66gD9YdrNLJJpexb8DFniBHJZEb93N6BoLif3cLszwncZuVWeM/oiKbZb2s9h5jK/95OwKk1/Dy2PYojhvF8ISS3ucHr84F3WieuoVzVyWyZ4K1VsPVEPEsAbG7DpyMwY47229ZxoCDFB9h7RrDkbf7S94bRh7jssObBdOuZuoNmvccBCwqjIRA8yC7wkK/EGUk4XAAkHR8kQM5JCUbXCwAhKNS5IEjF9BpJltgbyURJAjgEmlvs9hntGAoyBXarrANkoHZ3f1w0PPe9S7PxLPuOReFiPJ1PQOyJq2Q4bRlSXj0t3l8f47T1qWgfnRnYn9a4CMF3sYekGTVIOvYufrfeGCuWzWs7qyp3FdKL7X49rEs5Cazt9VuzmaxJ9jUvIaSYDXr9nRHmRu3FAAYU7NKscIJTeEWTi53orLPVprcmdEda6QiRghQalMPV7Y6AtdrA01NtQXUZVrmLIlgDsKlsX4nK8foEwRe9oPTT4ybhYN3sbCfYlOxO7U/NV+QXy6K3k0WPGCpKpyNLEWkH66Ib5NVFgi8frIp85hKf8234WuirnURvnzDgUIulyzSGI1nupWzvcbtA7Fb+1Tg/ScXO2EzhbQvzzTLD3OlDT+B8oumD3hSQ0YHrTccRT6DsQsNwaZCnLEXuGzlrdvNTFx0=;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="Wypociny"></category><category term="polityka"></category><category term="shitz"></category></entry><entry><title>[Encrypted] Moje ciało, cudza decyzja</title><link href="https://scyzoryk.fubar.pl/moje-cialo-cudza-decyzja.html" rel="alternate"></link><published>2020-10-26T15:54:00+01:00</published><updated>2020-10-26T15:54:00+01:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-10-26:/moje-cialo-cudza-decyzja.html</id><summary type="html">Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.</summary><content type="html">&lt;div id="pec-encrypted-content" style="display:none"&gt;cSW9x/nnV5zMMfpbbS2ntw==;fmooOUX/Qz8nzpDj9tRNtgDpvEK3v87cE0aI4RwSc2Dl+/uJITpM/re7t/sfA0rGg1L4oYPVpH39d6QMVCmtgF39exZLXB4oh5ET9YATJHYzJODz/KKMY/YKcMbHw/f/DsVMfeQqruDq5537x00mQpHjfiBF2Iwwtc667bJZsJ+RMiPx1pXUZ7WJ8gLOjoHAEOmM54qMmjXmBr0Ef1WlVNHiMeeCcQYCLThbib8luwYkvHMU9zywrn3rRCc4GWQHryUX7r1bNE6LLWVu2TequK+OOIVN2FYtuvbmivd++bPvp0ZRKBIrRKieu2FIGMa4RxEcrh9+N1w0bu/YtRvyga/G4ojyNcJB8WQt8RQdaQiSdclDq4JOSgbZZ1KH3fmY/rFTMCgqUNDPPMy8QXMROjA/7mrp5BlogS9RafgaPComrq1QexChXSwKqbeBNxxEuT9auEE1KIv8WpOzfzozYPlbZK1jFZx39mg4cAr3+oP6yI4iMMbTP6aWfdCErgm/9yqxVvuGHShiAVRs/PE0DX9xkQsty/UBHMDKMIDus+Kj1m/Lx/kOGrpmzfuZ2ULmvLBElAQLPw9HKDMpBIc5ZFqD8VNzMsE9/Pm+QjW5HwDltgsAGcLIesQ16Zm1opFQDA6jJ1Q/t2M6kXtgny182semMdL4/wrOgQ/gaeivXdi6e+XZesj1se6esMTvZMfqB0iR7REawrDRaJjFr0VeqmZClVQkthdNSAhoTOjPyU/xHqbyJM7uqQicWL1CMp/X7ddBZhS7oRucnwBJY26gVx414KuMZ5zd69IvyNKlIYCw7+oR1m7FT6kvJ9+kg2c0dxcHPQQQXCufdW5HW1EF0XPPllAuOh+jAKSogu0MvyGCQ7wN5FZQEquE8qXD3USf6ESosIekWrSfwXolloVfj3d8CStMbll44cknu9Mbrk5ZM6HbNHz3+DOpAq1H/PYI/mcvXdYtXsbmzcYzfWV2mWAsSQSad6Ql+v/JMN6AWQgs8t/tu0Zx5iC0jbKFpf6gGUdummODyp5VKRDxcpmsmGMkPdE8n/50CfFeu0VbjOuW90s8MtUOSGdkxQICJIhLdeneEyAmOhFtmKC2XEoMtFQ9m5lSeXrxusPTQ0eXXpYlLN+YOlLIm1ReS8r4Of0oWJTxcfSyNMxxZN0t1yO/QxH+CWYCFoRjHDhS4So7BOWcP2ZUBvcOSEsQJP4uOI64Sgg2pohjcaWixHdke+XGuzTYrXWYSxMSgoRh3fOdY2wUNh+siOwGLxOGqfgNXMawsa+Sygo3OcZKBj9lzasChO33MpbqFdPJSJdbco3ELvshlXkpA1iuG1oFa0/jUybVcjk+Bl2+WwHXASXBAVqJUEVD1/3bAZnKO7AgH671zcQgc1s2shBB2pgtKVGxdXafYGEkj0BNln17EtL0fmG6n/d24y39b5Fb7vs6jIrWT8jsmT6p3Lx467BY/zW6wfz2SrHVUQKiw/7z8rRrztmjLONLb28sp7mYZQOhohEZL6LsXrPRp6vw8iVkCMfjR4RsqF5d5p1ufvCv6iXGs9OVuk8J8CB6hzhyEjPd6DQpak9GMOHWXxtrhOGhFKAKLBgN9EhAyfjCgdkOAC6fHoGqwIalUSGFqkUM4qG+nblTjt3hbjeXSuS5kMgRwDBXB5jKHfqSnsVOQ2aBVHuc1saielBcPNasnG/NclcwsV7TThRoXEiaUmmzP5QqkWHEvOx6naCeOgoU2wg7j6VYIn/wmjUBGRGsfNSVKFnhLstDDCeKi4KuNnD8WRghQPbbR+8w3VFvqPpmLkUO+WH3VjO2FnvUXOKtdr1Z1h4D5JGnbQO2x/BNoBUx/6GdOD7CVbgd4P70dS88MPsdntKjHfjlrQhbxewALeUr5w3lVCRmO0OZJcjB+9q56CoKHzhl2r2MdX34rRHptX/ju2UBg4cBPjPIM7YYvsSKMYs7QM78+7P4BwNN6qg3y1t6mXIEY5LfOmJ8u6xDj+sUngyTd84K/xeO101ixNAeFrkv3m8EW8Qk3umvPxuHuVCfwxfonF7VNk/En04WDKdAS+aBm22hEAR7eRk4rWZ2CtutPwwLo7iioX15vc0oS0G/w/gam7Vvui9vqExtcOsxB5pfZlL6sstFifXr6xUIsB3eszsIaqge1J1lRTghYkkU3/xcxmwpT548hfD/QlOI/zKfnbAy/oVQV9qUrb3rIrbbjRYyxNkPMZQsjOusuZcMBl5kywGZi3CDnuHwc2RcQCYq5QK8g9hO/TDM5/ONn9ORWCaa9Pi6g6QO/k0CoPO+RxD4b6kJ1afojdyVJ2Zhwako+dGkyUj35ssgdPay5IeC+f9G84fbHvr7ymPZDee5vc3JkNPg/zY4qRooOb2yUHLv0tAeDDbEZgVkLQjPaN1qH0QEU9cjpTJ8ehqMTOPMVixX2RWaZl6l7vDA1SKiCA1rW1JwnbKBev6O6xFW7B0fVFoysSGfvAJl9+qf9rcgmrSoNBqPsWwccDgdC9rKv1zII73ctw65v/klyJx0BOey6oyh2BQk/dOH8jceeSCR/OufwjsjDJ2Kc3xebJ29FvcVmdbcP3a6oIKfI6ye13ebkVj+0sRMipYlk0lawX8xRp2Ug4EMsqTqo+dImK00Bo1yxLtEqzfyw4AXRnSCtsEiXHW5Dbn/3tTOtUCKEZ/+PmQ7FQJBc/hbHh+uTsP8/wXfzNsvbqaW7HrNVHfy4qRf3mkkMRKkWivW3Sxw9EHDBr6qp1UO+h6Wp7KJjuOhOo82bPF2oZeIuQIpwlT16Dbbx3QXjpgE7jIKfJgOSObxGaV2LIUS+89ZCbcf//98ITIcGQ+GdxqeX+InU1K12skz52egf8/CKhU+bH5tw/LeOyFn2yjhUdK3CY3pGN+l3LL9OUXwkq1n9XCBDaNjSPF4ET5BFLdg8zAvt9+WZq2eKakxC+6jjq0Ttf/5wX4r0SZ9b5BqKlMRYuWlz5q2ReYxNK0Mi2jaBuTRU7kRfY+TsDg//IJ+kwqQ1KgEq7eQatVLkIfQPw==;^&lt;/div&gt;
&lt;div id="pec-decrypted-content"&gt;
    &lt;h4&gt;&lt;i&gt;Ta treść została zaszyfrowana bo wariatów nie brakuje, a ja mam rodzinę.&lt;/i&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;form id="pec-decrypt-form"&gt;
    &lt;label for="pec-content-password"&gt;Password&lt;/label&gt;
    &lt;input type="password" id="pec-content-password" placeholder="Password" /&gt;
    &lt;button type="button" id="pec-decrypt-content"&gt;Decrypt&lt;/button&gt;
&lt;/form&gt;


&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/cipher-core.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/pad-nopadding.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes.js"&gt;&lt;/script&gt;


&lt;script type="text/javascript"&gt;
    (function () {
        var strip_padding = function (padded_content, padding_char) {
            /*
             * Strips the padding character from decrypted content.
             */
            for (var i = padded_content.length; i &gt; 0; i--) {
                if (padded_content[i - 1] !== padding_char) {
                    return padded_content.slice(0, i);
                }
            }
        };

        var decrypt_content = function (password, iv_b64, ciphertext_b64, padding_char) {
            /*
             * Decrypts the content from the ciphertext bundle.
             */
            var key = CryptoJS.MD5(password),
                iv = CryptoJS.enc.Base64.parse(iv_b64),
                ciphertext = CryptoJS.enc.Base64.parse(ciphertext_b64),
                bundle = {
                    key: key,
                    iv: iv,
                    ciphertext: ciphertext
                };

            var plaintext = CryptoJS.AES.decrypt(bundle, key, { iv: iv, padding: CryptoJS.pad.NoPadding });

            try {
                return strip_padding(plaintext.toString(CryptoJS.enc.Utf8), padding_char);
            }
            catch (err) {
                // encoding failed; wrong password
                return false;
            }
        };


        document.addEventListener('DOMContentLoaded', function () {
            var decrypt_btn = document.getElementById('pec-decrypt-content'),
                password_input = document.getElementById('pec-content-password'),
                encrypted_content = document.getElementById('pec-encrypted-content'),
                decrypted_content = document.getElementById('pec-decrypted-content'),
                decrypt_form = document.getElementById('pec-decrypt-form');

            var decrypt_document = function (event) {
                // grab the ciphertext bundle
                var parts = encrypted_content.innerHTML.split(';');

                // decrypt it
                var content = decrypt_content(
                    password_input.value,
                    parts[0],
                    parts[1],
                    parts[2]
                );

                if (content) {
                    // success; display the decrypted content
                    decrypted_content.innerHTML = content;
                    decrypt_form.parentNode.removeChild(decrypt_form);
                    encrypted_content.parentNode.removeChild(encrypted_content);

                    // any post processing on the decrypted content should be done here
                }
                else {
                    // ¯\_(ツ)_/¯
                    password_input.value = '';
                }
                event.preventDefault();
                return false;
            }
            
            decrypt_btn.addEventListener('click', decrypt_document);
            decrypt_form.addEventListener('submit', decrypt_document);
        });
    })();
&lt;/script&gt;</content><category term="Wypociny"></category><category term="shitz"></category></entry><entry><title>Niepokojące zjawisko</title><link href="https://scyzoryk.fubar.pl/niepokojace-zjawisko.html" rel="alternate"></link><published>2020-10-10T19:04:00+02:00</published><updated>2020-10-10T19:04:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-10-10:/niepokojace-zjawisko.html</id><summary type="html">&lt;p&gt;Czytam książkę "LaTeX - książka kucharska" i zaczyna mnie niepokoić ilość błędów językowych, jakie znajduję w tej lekturze.&lt;/p&gt;
&lt;p&gt;Książka opisuje system składu publikacji i to system, który kojarzony jest z bardzo wysoką jakością. To skojarzenie automatycznie przenosi się również na treść, ale nie chodzi mi nawet o przesłanie, narrację, itp. ale …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Czytam książkę "LaTeX - książka kucharska" i zaczyna mnie niepokoić ilość błędów językowych, jakie znajduję w tej lekturze.&lt;/p&gt;
&lt;p&gt;Książka opisuje system składu publikacji i to system, który kojarzony jest z bardzo wysoką jakością. To skojarzenie automatycznie przenosi się również na treść, ale nie chodzi mi nawet o przesłanie, narrację, itp. ale poprawność języka pod względem składni oraz logikę wypowiedzi.&lt;/p&gt;
&lt;p&gt;Początek książki brzmi tak:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Wszystko zaczęło się 30 marca 1977 roku. Donald E. Knuth usiadł przy&lt;/div&gt;
&lt;div class="line"&gt;swoim masywnym, drewnianym biurku ze zdobionymi nogami, w stylu typo-&lt;/div&gt;
&lt;div class="line"&gt;wym dla gabinetów Uniwersytetu Stanforda, by rozpocząć dzień od spraw-&lt;/div&gt;
&lt;div class="line"&gt;dzenia bieżącej poczty. Przez niewielkie okno za jego plecami wpadał kli-&lt;/div&gt;
&lt;div class="line"&gt;mat poranka w San Francisco w towarzystwie ciepłego, wiosennego słońca.&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rany boskie! Od kiedy klimat może wpaść przez okno!? I to jeszcze w towarzystwie. Nie chcę być złośliwy i przemilczę styl powyższych zdań. Dalej jest jeszcze trochę grafomanii, a potem na przykład takie zdanie:&lt;/p&gt;
&lt;blockquote&gt;
Zbiór 256 znaków nie mógł jednak wyczerpać potrzeb wszystkich narodów.&lt;/blockquote&gt;
&lt;p&gt;Zaraz, zaraz... czy można wyczerpać potrzeby? Potrzeby się zaspokaja, wyczerpują się zasoby. Zdanie powinno brzmieć:&lt;/p&gt;
&lt;blockquote&gt;
Zbiór 256 znaków nie mógł jednak zaspokoić potrzeb wszystkich narodów.&lt;/blockquote&gt;
&lt;p&gt;"Przeszedłem" jeszcze kilka rozdziałów i, na szczęście, jest dużo lepiej - części te, w większości ściśle technicznie, nie zawierają wpadek.&lt;/p&gt;
&lt;p&gt;Na razie.&lt;/p&gt;
</content><category term="Wypociny"></category><category term="język"></category><category term="LaTeX"></category></entry><entry><title>Hitler w algorytmie</title><link href="https://scyzoryk.fubar.pl/hitler_w_algorytmie.html" rel="alternate"></link><published>2020-10-03T16:29:00+02:00</published><updated>2020-10-03T16:29:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-10-03:/hitler_w_algorytmie.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Będzie o nauce w służbie człowieka, moralności, algorytmach śledzących i mętnych tłumaczeniach.&lt;/p&gt;
&lt;p&gt;Zaczęło się od reklamowej wrzutki na LinkedIn, w której prezentowana była usługa zwana "Behavioural Biometrics". Po polsku chodzi o rozpoznawanie ludzi na podstawie zachowań. Termin brzmi neutralnie ale dotyczy jednej z …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: artykuł nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Będzie o nauce w służbie człowieka, moralności, algorytmach śledzących i mętnych tłumaczeniach.&lt;/p&gt;
&lt;p&gt;Zaczęło się od reklamowej wrzutki na LinkedIn, w której prezentowana była usługa zwana "Behavioural Biometrics". Po polsku chodzi o rozpoznawanie ludzi na podstawie zachowań. Termin brzmi neutralnie ale dotyczy jednej z najwstrętniejszych technik śledzenia ludzi.&lt;/p&gt;
&lt;p&gt;Każdy człowiek na świecie ma wiele wyróżniających go cech, które pozwalają nam wzajemnie się rozpoznawać. Są one związane z naszymi zmysłami, których (odkrytych) na razie mamy 5: wzrok, słuch, węch, smak i dotyk.&lt;/p&gt;
&lt;p&gt;Wikipedia podsuwa jeszcze 4 kolejne: nocycepcja, zmysł temperatury, zmysł równowagi, propriocepcja, percepcja czasu.&lt;/p&gt;
&lt;p&gt;Rozpoznajemy się nawzajem za pomocą wzroku - porównujemy twarz z zapisanym w pamięci "rekordem identyfikacji", słuchu - rozróżniamy tembr i inne cechy głosu, zapachu i dotyku. Nie jestem pewny jak jest ze smakiem.&lt;/p&gt;
&lt;p&gt;Nieco podobnie jest&lt;/p&gt;
&lt;p&gt;Fala p300&lt;/p&gt;
</content><category term="Nauka"></category></entry><entry><title>Postęp? To przestało być śmieszne.</title><link href="https://scyzoryk.fubar.pl/postep-to-przestalo-byc-smieszne.html" rel="alternate"></link><published>2020-09-28T12:32:00+02:00</published><updated>2020-09-28T12:32:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-09-28:/postep-to-przestalo-byc-smieszne.html</id><summary type="html">&lt;p&gt;W któryś tam epizodzie &lt;a class="reference external" href="https://www.wikiwand.com/pl/Teoria_wielkiego_podrywu"&gt;"Teorii wielkiego podrywu"&lt;/a&gt; (The Big Bang Theory) pada dowcip, który właśnie przestał być zabawny. Z powodu postępu.&lt;/p&gt;
&lt;div class="float wp-block-gallery columns-2 is-cropped docutils container"&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd1" src="/uploads/2020/09/3dglasses01.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd2" src="/uploads/2020/09/3dglasses02.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd3" src="/uploads/2020/09/3dglasses03.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd4" src="/uploads/2020/09/3dglasses04.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd5" src="/uploads/2020/09/3dglasses05.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd6" src="/uploads/2020/09/3dglasses06.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Jest wrzesień 2020 roku czyli od premiery tego odcinka serialu minęło prawie dokładnie 9 lat i mamy coś co nie jest wprawdzie parą okularów do oglądania wszystkiego w 3D …&lt;/p&gt;</summary><content type="html">&lt;p&gt;W któryś tam epizodzie &lt;a class="reference external" href="https://www.wikiwand.com/pl/Teoria_wielkiego_podrywu"&gt;"Teorii wielkiego podrywu"&lt;/a&gt; (The Big Bang Theory) pada dowcip, który właśnie przestał być zabawny. Z powodu postępu.&lt;/p&gt;
&lt;div class="float wp-block-gallery columns-2 is-cropped docutils container"&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd1" src="/uploads/2020/09/3dglasses01.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd2" src="/uploads/2020/09/3dglasses02.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd3" src="/uploads/2020/09/3dglasses03.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd4" src="/uploads/2020/09/3dglasses04.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd5" src="/uploads/2020/09/3dglasses05.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;div class="figure"&gt;
&lt;img alt="slajd6" src="/uploads/2020/09/3dglasses06.jpg" style="width: 400px;"/&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Jest wrzesień 2020 roku czyli od premiery tego odcinka serialu minęło prawie dokładnie 9 lat i mamy coś co nie jest wprawdzie parą okularów do oglądania wszystkiego w 3D ale technologię, która na podstawie płaskich zdjęć tworzy trzeci wymiar:&lt;/p&gt;
&lt;div class="float wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio docutils container"&gt;
&lt;div class="wp-block-embed-wrapper docutils container"&gt;
&lt;a class="reference external" href="https://youtu.be/T29O-MhYALw"&gt;https://youtu.be/T29O-MhYALw&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Jak widać, z analizy zdjęć algorytm generuje brakujący wymiar. Efekt jest fascynujący ale najlepsze jest to, że naprawdę ziściło się marzenie tego grubasa z serialu.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;p.s.:&lt;/div&gt;
&lt;div class="line"&gt;YouTube to przestarzała platforma, odchodząca w niebyt i nie wiem jak długo ten film tu zostanie, dokładam więc link do artykułów:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="https://nerf-w.github.io/"&gt;NeRF in the Wild&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;na &lt;a class="reference external" href="https://arxiv.org/abs/2008.02268"&gt;arxiv.org&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Przyśnił mi się dziś taki dowcip:&lt;/div&gt;
&lt;div class="line"&gt;&lt;em&gt;Scrum Master wchodzi do pokoju developerów w którym są dwa stanowiska. Przy jednym, na fotelu, siedzi Senior Developer Mateusz, drugie jest puste. Scrum Master podchodzi do pustego fotela i kładzie na nim kartkę z napisanym dużymi literami imieniem: Adrian. Mateusz patrzy najpierw na nią, potem pytająco na Scrum Mastera. Scrum Master mówi wskazując kartkę: - Musiałem zwolnić Adriana, to jest jego zastępca. Więcej ci pomoże.&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Wniosek: &lt;em&gt;przed snem nie jeść oglądając HRejterów.&lt;/em&gt;&lt;/p&gt;
</content><category term="Wypociny"></category><category term="postęp"></category><category term="3d"></category></entry><entry><title>Skrypt kontra spamerzy cz. 2</title><link href="https://scyzoryk.fubar.pl/skrypt-kontra-spamerzy-cz-2.html" rel="alternate"></link><published>2020-09-24T08:09:00+02:00</published><updated>2020-09-24T08:09:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2020-09-24:/skrypt-kontra-spamerzy-cz-2.html</id><summary type="html">&lt;p&gt;W &lt;a class="reference external" href="https://scyzoryk.fubar.pl/skrypt-kontra-spamerzy/"&gt;pierwszej części&lt;/a&gt; pisałem o japońskim filmie, Reksiu, historii dwukropka oraz, co najmniej chyba ważne, skrypcie do blokowania spamerów.&lt;/p&gt;
&lt;p&gt;Część druga będzie krótka ponieważ jest tylko rozwinięciem istniejącego już skryptu. Pokażę teraz co do niego dodałem:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cat spammers.log | awk ' BEGIN { FS = "," } {if ($2 &amp;gt; 333) system("ipset add blacklist "$1 …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;W &lt;a class="reference external" href="https://scyzoryk.fubar.pl/skrypt-kontra-spamerzy/"&gt;pierwszej części&lt;/a&gt; pisałem o japońskim filmie, Reksiu, historii dwukropka oraz, co najmniej chyba ważne, skrypcie do blokowania spamerów.&lt;/p&gt;
&lt;p&gt;Część druga będzie krótka ponieważ jest tylko rozwinięciem istniejącego już skryptu. Pokażę teraz co do niego dodałem:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
cat spammers.log | awk ' BEGIN { FS = "," } {if ($2 &amp;gt; 333) system("ipset add blacklist "$1)}'
&lt;/pre&gt;
&lt;p&gt;Plik "spammers.log" jest właściwie w formacie CSV, bo poszczególne pola oddzielone są przecinkiem (coma separated value), a rekordy znakiem nowej linii. Z tej właściwości korzystam w dodanym fragmencie.&lt;/p&gt;
&lt;p&gt;Dyrektywa &lt;tt class="docutils literal"&gt;FS = ","&lt;/tt&gt; mówi &lt;em&gt;awk&lt;/em&gt;-owi, że znakiem rozdzielającym pola jest przecinek. Dzięki temu każdy rekord czyli jedną linię pliku &lt;em&gt;awk&lt;/em&gt; dzieli na pola, a znajdujące się w nich wartości podstawia odpowiednio pod zmienne: $1 i $2.&lt;/p&gt;
&lt;p&gt;Ponieważ plik wygląda tak:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
212.70.149.83       ,19652
193.35.48.18        ,27796
45.142.120.209      ,39014
45.142.120.192      ,45761
45.142.120.53       ,72477
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;to dla 1-ej linii zmienna $1 będzie miała wartość 212.70.149.83, a zmienna $2 wartość 19652.&lt;/div&gt;
&lt;div class="line"&gt;&lt;strong&gt;Nota bene: oznacza to, że gnojek spod ww. adresu IP połączył się z serwerem w dość krótkim czasie, ponad 19 tysięcy razy!&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Potem następuje instrukcja warunkowa, mówiąca mniej więcej to: jeśli wartośc zmiennej $2 przekracza 333 to uruchom polecenie systemowe. O co chodzi z liczbą 333? Jeśli jakiś host połączy się w krótkim czasie z moim więcej niż 333 razy to najprawdopodobniej jest to spammer.&lt;/p&gt;
&lt;p&gt;Tak, wiem. Liczba jest z kosmosu. Ale tylko na razie. Przecież po to są komputery, żeby cierpliwie zbierać dane i na ich podstawie urealniać kosmiczne założenia. Ale to później. Na razie niech zostanie 333, bo ładnie wygląda.&lt;/p&gt;
&lt;p&gt;Polecenie &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;system("ipset&lt;/span&gt; add blacklist "$1)&lt;/tt&gt;mówi &lt;em&gt;awk&lt;/em&gt;-owi, by dla spełnionego wyżej opisanego warunku uruchomił &lt;em&gt;ipset&lt;/em&gt;. A &lt;em&gt;ipset&lt;/em&gt; dodaje do blacklisty IP, które przechowane jako wartość zmiennej $2.&lt;/p&gt;
&lt;p&gt;No i na razie tyle.&lt;/p&gt;
&lt;p&gt;Pozstało jeszcze parę rzeczy do zrobienia:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;statystyka, która być może da odpowiedź jak odróżnić spamerów od zwykłych połączeń,&lt;/li&gt;
&lt;li&gt;zachowywanie ustawień &lt;em&gt;ipset&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;odtwarzanie tych ustawień.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zabawa robi się coraz fajniejsza.&lt;/p&gt;
</content><category term="Administracja"></category><category term="linux"></category><category term="mail"></category></entry><entry><title>Streaming video/audio live</title><link href="https://scyzoryk.fubar.pl/streaming-video-audio-live.html" rel="alternate"></link><published>2020-09-23T22:32:00+02:00</published><updated>2020-09-23T22:32:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-09-23:/streaming-video-audio-live.html</id><summary type="html">&lt;p&gt;Założenie konta na LinkedIn już zaowocowało!!! Właśnie zakończyliśmy realizację prac dla dużej telewizji internetowej. Najfajniej, że wszystko świetnie działa i już zostało sprawdzone w realnych warunkach czyli podczas dużego wydarzenia medialnego.&lt;/p&gt;
&lt;div class=section id=zlecenie&gt;
&lt;h2&gt;Zlecenie:&lt;/h2&gt;
&lt;p&gt;stworzenie systemu, który umożliwi strumieniowe przesyłanie sygnału audio i wideo (live) z kamer na mieście do studia.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=section id=wymagania&gt;
&lt;h2&gt;Wymagania …&lt;/h2&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Założenie konta na LinkedIn już zaowocowało!!! Właśnie zakończyliśmy realizację prac dla dużej telewizji internetowej. Najfajniej, że wszystko świetnie działa i już zostało sprawdzone w realnych warunkach czyli podczas dużego wydarzenia medialnego.&lt;/p&gt;
&lt;div class=section id=zlecenie&gt;
&lt;h2&gt;Zlecenie:&lt;/h2&gt;
&lt;p&gt;stworzenie systemu, który umożliwi strumieniowe przesyłanie sygnału audio i wideo (live) z kamer na mieście do studia.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=section id=wymagania&gt;
&lt;h2&gt;Wymagania:&lt;/h2&gt;
&lt;ul class=simple&gt;
&lt;li&gt;możliwość rekonfigurowania parametrów streamu w zdalnym urządzeniu,&lt;/li&gt;
&lt;li&gt;failover w zdalnym urządzeniu - za pomocą dwóch łącz komórkowych od różnych dostawców,&lt;/li&gt;
&lt;li&gt;łatwe przywracanie konfiguracji w przypadku błędu,&lt;/li&gt;
&lt;li&gt;łatwe klonowanie konfiguracji na wiele urządzęń,&lt;/li&gt;
&lt;li&gt;niski koszt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Graficznie całość przedstawia się tak:&lt;/p&gt;
&lt;div class="wp-block-image docutils container"&gt;
&lt;div class=figure&gt;
&lt;img alt="Streaming - wizualizacja" src="/uploads/2020/09/streaming2-1.png"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=section id=wykonanie&gt;
&lt;h3&gt;Wykonanie:&lt;/h3&gt;
&lt;p&gt;Każdy operator kamery (albo pomocnik) ma na sobie uprząż w której zamocowane są następujące komponenty:&lt;/p&gt;
&lt;ul class=simple&gt;
&lt;li&gt;konwerter mediów połączony z kamerą złączem SDI, który podłączony jest do&lt;/li&gt;
&lt;li&gt;routera ze skonfigurowanym kanałem VPN, który dostęp do Internetu ma z dwóch źródeł:&lt;ol class=arabic&gt;
&lt;li&gt;routera LTE uruchomionego w trybie tzw. przezroczystego bridge'a czyli de facto zachowuje się jak modem LTE.&lt;/li&gt;
&lt;li&gt;oraz tzw. gwizdka czyli modemu LTE na złączu USB.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Po stronie studia jest stałe łącze światłowodowe, router i switch oraz bardzo silny komputer, który w locie dodaje do streamów elementy graficzne, jak np. logo stacji telewizyjnej&lt;sup id=sf-streaming-video-audio-live-1-back&gt;&lt;a href=#sf-streaming-video-audio-live-1 class=simple-footnote title="Istnieje możliwość dołożenia serwera, który może streamy zapisywać albo konwertować i jendocześnie restreamować do wybranej aplikacji."&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Kamery nie opisuję, bo kwestia jej wyboru nie ma żadnego znaczenia. Podobnie jak wybór routera LTE, który może stać się modemem. Po prostu trzeba taki router przed zakupem sprawdzić, mogę polecić router &lt;strong&gt;Huawei E5186s-22a LTE&lt;/strong&gt;, którego "przeróbkę" na bridge opisałem w &lt;a class="reference external" href="https://scyzoryk.fubar.pl/huawei-e5186s-22a-lte-router-bridge-mode/"&gt;innym artykule&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Najciekawszym elementem systemu jest zatem router pełniący rolę klienta VPN i umożliwiający automatyczne przełączanie źródła Internetu w przypadku gdy jedno z nich przestaje działać (failover).&lt;/p&gt;
&lt;p&gt;Rolę routera w ty rozwiązaniu pełni &lt;a class="reference external" href="https://mikrotik.com/product/RB951Ui-2nD"&gt;Mikrotik hAP&lt;/a&gt;, malutkie ale zwinne urządzenie z RouterOS-em na pokładzie.&lt;/p&gt;
&lt;p&gt;Dwa interfejsy: &lt;strong&gt;ether1&lt;/strong&gt; i &lt;strong&gt;lte1&lt;/strong&gt; łączą z Internetem, &lt;strong&gt;ether1&lt;/strong&gt; z routerem (modemem) D-Link LTE, a &lt;strong&gt;lte1&lt;/strong&gt; z gwizdkiem LTE. Oba znajdują się w grupie interfesjów WAN.&lt;/p&gt;
&lt;p&gt;Po skonfigurowaniu Mikrotika z domyślnymi ustawieniami dla trybu WISP-AP (robi się w trybie Quickset), interfejs WiFi został wyłączony, ponieważ nie będzie używany.&lt;/p&gt;
&lt;p&gt;Potem można już było ustawić firewall, failover oraz VPN-y.&lt;/p&gt;
&lt;p&gt;Najważniejsze, że do konwerterów SDI można się zalogować bezpośrednio z PC obsługującego transmisję i zmienić parametry streamów, np. birate. Szkoda, że sam konwerter nie został wyposażony w API pozwalające na przesyłanie komend, w takim przypadku napisalibyśmy skrypty i ułatwili pracę realizatora programu&lt;sup id=sf-streaming-video-audio-live-2-back&gt;&lt;a href=#sf-streaming-video-audio-live-2 class=simple-footnote title="Konwerter działa pod kontrolą Linuksa, firmware zawiera pliki, które dają nadzieję na dołożenie skryptów."&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Inną ważną cechą zestawu jest łatwość jego klonowania, która sprowadza się do zapisania ustawień, a następnie wczytania ich na nowym urządzeniu. Można w ten sposób w krótkim czasie przygotować setki urządzeń.&lt;/p&gt;
&lt;p&gt;Reszty konfiguracji nie będę tu opisywał ale jeśli ktoś potrzebuje pełnego technicznego opisu to zapraszam do &lt;a class="reference external" href="https://emcf.pl/#nav-kontakt"&gt;kontaktu&lt;/a&gt;. Chętnie podzielimy się wiedzą, a jeśli ktoś po prostu potrzebuje podobnego zestawu możemy go wykonać.&lt;/p&gt;
&lt;p&gt;[1] *&lt;/p&gt;
&lt;p&gt;[2] *&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol class=simple-footnotes&gt;&lt;li id=sf-streaming-video-audio-live-1&gt;Istnieje możliwość dołożenia serwera, który może streamy zapisywać albo konwertować i jendocześnie restreamować do wybranej aplikacji. &lt;a href=#sf-streaming-video-audio-live-1-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=sf-streaming-video-audio-live-2&gt;Konwerter działa pod kontrolą Linuksa, firmware zawiera pliki, które dają nadzieję na dołożenie skryptów. &lt;a href=#sf-streaming-video-audio-live-2-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</content><category term="Multimedia"></category><category term="systemy"></category><category term="streaming"></category><category term="bezpieczeństwo"></category><category term="komunikacja"></category><category term="mikrokontrolery"></category></entry><entry><title>Przypadek 500-milowego e-maila</title><link href="https://scyzoryk.fubar.pl/przypadek-500-milowego-e-maila.html" rel="alternate"></link><published>2020-09-11T09:03:00+02:00</published><updated>2020-09-11T09:03:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2020-09-11:/przypadek-500-milowego-e-maila.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Poniżej moje tłumaczenie, kalekie zapewne, jednej z przepysznych anegdot z historii komputerów. To lubię. Oryginał wciąż dostępny&lt;/strong&gt; &lt;a class="reference external" href="http://www.acme.com/jef/netgems/500miles.html"&gt;http://www.acme.com/jef/netgems/500miles.html&lt;/a&gt;&lt;em&gt;**&lt;/em&gt;. Wymagana podstawowa znajomość systemów z rodziny Unices oraz spolszczonego slangu.
**&lt;/p&gt;
&lt;p&gt;Subject: Przypadek 500-milowego e-maila.&lt;/p&gt;
&lt;div class=line-block&gt;
&lt;div class=line&gt;Date: Tue, 26 Nov 2002 14:57:40 -0800&lt;/div&gt;
&lt;div class=line&gt;From: Trey …&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Poniżej moje tłumaczenie, kalekie zapewne, jednej z przepysznych anegdot z historii komputerów. To lubię. Oryginał wciąż dostępny&lt;/strong&gt; &lt;a class="reference external" href="http://www.acme.com/jef/netgems/500miles.html"&gt;http://www.acme.com/jef/netgems/500miles.html&lt;/a&gt;&lt;em&gt;**&lt;/em&gt;. Wymagana podstawowa znajomość systemów z rodziny Unices oraz spolszczonego slangu.
**&lt;/p&gt;
&lt;p&gt;Subject: Przypadek 500-milowego e-maila.&lt;/p&gt;
&lt;div class=line-block&gt;
&lt;div class=line&gt;Date: Tue, 26 Nov 2002 14:57:40 -0800&lt;/div&gt;
&lt;div class=line&gt;From: Trey Harris To: &lt;a class="reference external" href=mailto:0xdeadbeef@petting-zoo.net&gt;0xdeadbeef@petting-zoo.net&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Oto przypadek, który brzmiał niewarygodnie; właściwie żałuję, że opowiadanie udostępniłem szerokiemu gronu, bo to świetnia dykteryjka na konferencyjne posiedzenia w barze. ;-) Historia została lekko podrasowana aby ochronić winnych, pominąć nudne lub nieistotne szczegóły oraz uczynić ją bardziej wciągającą.&lt;/p&gt;
&lt;p&gt;Pracowałem wtedy przy obsłudze uniwersyteckiego systemu poczty elektronicznej. Było to parę lat temu. Pewnego dnia zadzwonił do mnie szef działu statystycznego.&lt;/p&gt;
&lt;ul class=simple&gt;
&lt;li&gt;Mamy kłopot z wysyłaniem e-maili.&lt;/li&gt;
&lt;li&gt;Co się dzieje? - spytałem.&lt;/li&gt;
&lt;li&gt;Nie możemy wysłać poczty dalej niż 500 mil.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zakrztusiłem się kawą: - Słucham!?&lt;/p&gt;
&lt;ul class=simple&gt;
&lt;li&gt;Nie możemy wysłać żadnego e-maila dalej niż 500 mil stąd. - powtórzył - Konkretnie to ciut dalej, powiedzmy 520 mil. Ale nie dalej.&lt;/li&gt;
&lt;li&gt;Eee... E-maile tak nie działają, proszę pana - powiedziałem, próbując nie panikować. Nie powinno się okazywać paniki podczas rozmowy z szefem działu, nawet jeśli jest to szef działu tak niewiele znaczącego jak statystyka. - Dlaczego uważa pan, że wasze e-maile nie dochodzą dalej niż 500 mil?&lt;/li&gt;
&lt;li&gt;Proszę pana, ja nie *uważam*, ja wiem. - odparł szef - Widzi pan, gdy po raz pierwszy to zauważyliśmy czyli kilka dni temu...&lt;/li&gt;
&lt;li&gt;Kilka dni?! Czekaliście z tym kilka dni?! - przerwałem mu - I przez cały ten czas nie mogliście wysyłać poczty?&lt;/li&gt;
&lt;li&gt;Mogliśmy. Tyle, że nie dalej niż...&lt;/li&gt;
&lt;li&gt;500 mil, tak, tak. - znowu mu przerwałem - Rozumiem. Ale czemu nie zadzwoniliście wcześniej?&lt;/li&gt;
&lt;li&gt;Prawdę mówiąc, nie mieliśmy dostatecznej ilości danych, żeby upewnić się w czym rzecz. Aż do dzisiaj...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;"No tak, przecież to szef STATYSTYKI."&lt;/p&gt;
&lt;ul class=simple&gt;
&lt;li&gt;W każdym razie, poprosiłem jedną z geostatystyczek, żeby się temu przyjrzała...&lt;/li&gt;
&lt;li&gt;Geostatystyczek!?&lt;/li&gt;
&lt;li&gt;Tak. I przygotowała mapę z zaznaczonym okręgiem, w zasięgu którego nasze e-maile docierają. W promieniu nieco ponad 500 mil jest kilka miejsc do których nie docieramy lub dobijamy się sporadycznie, jednak poza ten okrąg wyjść nie możemy.&lt;/li&gt;
&lt;li&gt;Rozumiem. - powiedziałem i złapałem się za głowę - Kiedy to się zaczęło? Powiedział pan, że kilka dni temu, ale czy w międzyczasie nic się nie zmieniło w waszych systemach?&lt;/li&gt;
&lt;li&gt;Był tu informatyk, zapaczował nasz serwer i zrestartował. Dzwoniłem do niego ale twierdzi, że do systemu pocztowego w ogóle się nie dotykał.&lt;/li&gt;
&lt;li&gt;OK, zobaczę co się dzieje i zadzwonię do pana. - powiedziałem, próbując uwierzyć, że ktoś robi sobie ze mnie jaja. To nie był Prima Aprilis ale zastanawiałem się czy nie zalazłem komuś za skórę na tyle, żeby próbował się odegrać.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zalogowałem się na serwer statystyków i wysłałem kilka testowych e-maili. Znajdowałem się w Trójkącie Naukowym w Północnej Karolinie i e-maile dotarły na moje konto bez problemu. Tak samo wysłane do Richmond, do Atlanty i Waszyngtonu. Inny, puszczony do Princeton (400 mil) też zadziałał.&lt;/p&gt;
&lt;p&gt;Ale potem spróbowałem wysłać pocztę do Memphis (600 mil). Nie doszła. Boston, też nie doszła. Detroit, również porażka. Wziąłem książkę adresową i próbowałem zawęzić obszar. Nowy Jork (420 mil) działał ale Providence (580 mil) już nie.&lt;/p&gt;
&lt;p&gt;Zacząłem się martwić o swoje zdrowie psychiczne. Napisałem do kolegi mieszkającego w Północnej Karolinie, którego prowajder internetowy znajdował się w Seattle. Na szczęście, to nie zadziałało. Gdyby okazało się, że to ma coś wspólnego z położeniem geograficznym odbiorcy, a nie z jego serwerem pocztowym, pewnie rzuciłbym się z płaczem na podłogę.&lt;/p&gt;
&lt;p&gt;Po ustaleniu, że choć to nieprawdopodobne, problem rzeczywiście istnieje i jest powtarzalny, rzuciłem okiem w plik sendmail.cf. Wyglądał dosyć normalnie. Wyglądał znajomo.&lt;/p&gt;
&lt;p&gt;Porównałem go diffem &lt;sup id=sf-przypadek-500-milowego-e-maila-1-back&gt;&lt;a href=#sf-przypadek-500-milowego-e-maila-1 class=simple-footnote title="diff (od differences - ang. różnice) program do porównywania plików i wyświetlania różnic między nimi."&gt;1&lt;/a&gt;&lt;/sup&gt; z kopią w moim katalogu domowym. Nikt go nie zmienił - to był ten sam plik, który stworzyłem. I byłem prawie pewny, że nie włączałem w nim opcji "FAIL_MAIL_OVER_500_MILES?". &lt;sup id=sf-przypadek-500-milowego-e-maila-2-back&gt;&lt;a href=#sf-przypadek-500-milowego-e-maila-2 class=simple-footnote title='"PORZUĆ_EMAIL_DALEJ_NIŻ_500_MIL?" - nie tłumaczę w tekście tej nieistniejącej opcji bo konfiguracja Sendmaila, z tego co wiem, dopuszcza jedynie ustalone, angielskie terminy.'&gt;2&lt;/a&gt;&lt;/sup&gt; Nie wiedząc co robić, telnetnąłem się na port SMTP. Serwer wyświetlił banner Sunowskiego sendmaila &lt;sup id=sf-przypadek-500-milowego-e-maila-3-back&gt;&lt;a href=#sf-przypadek-500-milowego-e-maila-3 class=simple-footnote title="Program do obsługi poczty, serwer w odróżnieniu od programów klienckich takich jak Pine czy Mutt."&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Chwila, moment! banner Sunowskiego sendmaila? W tym czasie, wraz ze swoim systemem Sun wciąż dostarczał Sendmaila 5, mimo że Sendmail 8 był już całkiem dojrzałym programem. Jako dobry administrator oparłem się właśnie na wersji 8. I również jako dobry administrator napisałem własnoręcznie sendmail.cf, używając w nim długich, opisowych dyrektyw dostępnych w Sendmailu 8, zamiast zagadkowych, pełnych znaków interpunkcyjnych dyrektyw z Sendmaila 5.&lt;/p&gt;
&lt;p&gt;Wszystkie kawałki układanki znalazły się na miejscu, a ja zakrztusiłem się fusami wystygłej kawy! Podczas gdy informatyk &lt;cite&gt;paczował serwer&lt;/cite&gt; najwyraźniej zapgrejdował SunOS-a, i jednocześnie *zdałngrejdował* Sendmaila. Uaktualnienie szczęśliwie pozostawiło sendmail.cf bez zmian ale obecnie w niewłaściwej wersji.&lt;/p&gt;
&lt;p&gt;Najwidoczniej Sendmail 5 - lub wersja, którą rozprowadzał Sun - dawała sobie radę z sendmail.cf z wersji 8-ej bo większość dyrektyw pozostała niezmieniona. Nowe, długie dyrektywy konfiguracyjne Sendmail potraktował jako śmieci i odpuścił je sobie. A że, binarka Sendmaila nie ma wkompilowanych ustawień domyślnych dla większości z nich, nie znalazłszy ich w sendmail.cf poustawiała je na zero.&lt;/p&gt;
&lt;p&gt;Jednym z wyzerowanych ustawień był timeout przy połączeniu do zdalnego serwera SMTP. Po paru eksperymentach okazało się, że dla tej konkretnej maszyny, przy jej typowym obciążeniu, zerowy timeout zamyka połączenie po upływie &lt;cite&gt;ciut więcej&lt;/cite&gt; niż trzech milisekund.&lt;/p&gt;
&lt;p&gt;Nasza sieć uniwersytecka miała w tym czasie dość dziwną cechę, mianowicie była w 100% przełączalna. Pakiet wychodzący nie powodował opóźnienia routera dopóki nie dotarł do POP-a &lt;sup id=sf-przypadek-500-milowego-e-maila-4-back&gt;&lt;a href=#sf-przypadek-500-milowego-e-maila-4 class=simple-footnote title="Point Of Precence czyli Miesce Obecności czyli jakiś host lub urządzenie aktywne."&gt;4&lt;/a&gt;&lt;/sup&gt;, zawrócił i osiągnął router od drugiej strony. Czas na połączenie ze zdalnym, niezbyt obciążonym hostem był w w większym stopniu zależny od odległości mierzonej prędkością światła niż od opóźnień routera.&lt;/p&gt;
&lt;p&gt;Czując lekkie zawroty głowy, wpisałem w shellu:&lt;/p&gt;
&lt;div class=line-block&gt;
&lt;div class=line&gt;$ units &lt;sup id=sf-przypadek-500-milowego-e-maila-5-back&gt;&lt;a href=#sf-przypadek-500-milowego-e-maila-5 class=simple-footnote title="Dla tych co nie korzystali nigdy z programu units, jest to bardzo rozbudowany ale prosty w użyciu konwerter jednostek. Po ruchomieniu pyta You have: czyli co masz, należy wtedy wpisać liczbę oraz jednostki które chcemy przeliczyć, potem pyta You want: czyli czego chcesz, należy wpisać jednostki na które poprzednia wartość ma być przeliczona. Na koniec pojawia się wynik."&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/div&gt;
&lt;div class=line&gt;1311 units, 63 prefixes&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code output literal-block"&gt;&lt;span class=go&gt;You have: 3 millilightseconds
You want: miles
   * 558.84719
   / 0.0017893979&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;500 mil, konkretnie ciut dalej.&lt;/p&gt;
&lt;p&gt;Trey Harris&lt;/p&gt;
&lt;hr class=docutils&gt;
&lt;div class=line-block&gt;
&lt;div class=line&gt;W opowiadaniu ostatni akapit w wersji polskiej units wyglądałby tak:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code output literal-block"&gt;&lt;span class=go&gt;$ units
1311 units, 63 prefixes
Masz: 3 milisekundy świetlne
Chcesz: mile
   * 558.84719
   / 0.0017893979&lt;/span&gt;
&lt;/pre&gt;
&lt;ol class=simple-footnotes&gt;&lt;li id=sf-przypadek-500-milowego-e-maila-1&gt;diff (od differences - ang. różnice) program do porównywania plików i wyświetlania różnic między nimi. &lt;a href=#sf-przypadek-500-milowego-e-maila-1-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=sf-przypadek-500-milowego-e-maila-2&gt;"PORZUĆ_EMAIL_DALEJ_NIŻ_500_MIL?" - nie tłumaczę w tekście tej nieistniejącej opcji bo konfiguracja Sendmaila, z tego co wiem, dopuszcza jedynie ustalone, angielskie terminy. &lt;a href=#sf-przypadek-500-milowego-e-maila-2-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=sf-przypadek-500-milowego-e-maila-3&gt;Program do obsługi poczty, serwer w odróżnieniu od programów klienckich takich jak Pine czy Mutt. &lt;a href=#sf-przypadek-500-milowego-e-maila-3-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=sf-przypadek-500-milowego-e-maila-4&gt;Point Of Precence czyli Miesce Obecności czyli jakiś host lub urządzenie aktywne. &lt;a href=#sf-przypadek-500-milowego-e-maila-4-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=sf-przypadek-500-milowego-e-maila-5&gt;Dla tych co nie korzystali nigdy z programu &lt;cite&gt;units&lt;/cite&gt;, jest to bardzo rozbudowany ale prosty w użyciu konwerter jednostek. Po ruchomieniu pyta &lt;cite&gt;You have:&lt;/cite&gt; czyli co masz, należy wtedy wpisać liczbę oraz jednostki które chcemy przeliczyć, potem pyta &lt;cite&gt;You want:&lt;/cite&gt; czyli czego chcesz, należy wpisać jednostki na które poprzednia wartość ma być przeliczona. Na koniec pojawia się wynik. &lt;a href=#sf-przypadek-500-milowego-e-maila-5-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</content><category term="Historia komputerów"></category><category term="nostalgia"></category><category term="shitz"></category></entry><entry><title>Terminal st, VIM i kolory</title><link href="https://scyzoryk.fubar.pl/terminal-st-vim-i-kolory.html" rel="alternate"></link><published>2020-08-22T19:05:00+02:00</published><updated>2020-08-22T19:05:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-08-22:/terminal-st-vim-i-kolory.html</id><summary type="html">&lt;p&gt;Sam sobie zgotowałem ten los! Zacząłem używać skórki &lt;a class="reference external" href="https://github.com/nightsense/cosmic_latte"&gt;Cosmic Latte&lt;/a&gt;, i w shellu i w VIM-ie, i dobrze mi z tym jest, z jednym zastrzeżeniem: w trybie Insert w VIM-ie bardzo słabo widać gdzie znajduje się kursor.&lt;/p&gt;
&lt;p&gt;Naprawiłem to wprowadzając podświetlenie kolumny, dopisałem do .vimrc to:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;set cursorcolumn (demo można …&lt;/tt&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sam sobie zgotowałem ten los! Zacząłem używać skórki &lt;a class="reference external" href="https://github.com/nightsense/cosmic_latte"&gt;Cosmic Latte&lt;/a&gt;, i w shellu i w VIM-ie, i dobrze mi z tym jest, z jednym zastrzeżeniem: w trybie Insert w VIM-ie bardzo słabo widać gdzie znajduje się kursor.&lt;/p&gt;
&lt;p&gt;Naprawiłem to wprowadzając podświetlenie kolumny, dopisałem do .vimrc to:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;set cursorcolumn (demo można sobie zrobić wpisując :set cul)&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Było mi mało, więc podświetliłem też wiersz:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;set &lt;span class="pre"&gt;hl=.:Visual&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Kropka oznacza aktywny wiersz, a po dwukropku znajduje się nazwa szablonu kolorów. Można się tym fajnie bawić, np. przekreślenie aktywnego wiersza to:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;set &lt;span class="pre"&gt;hl=.t&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Wciąż było mi mało, chciałem mieć kursor w innym niż domyślny kolorze ale żadne ustawienia nie działały. Taki efekt można uzyskać np. w 256-kolorowym xtermie, wykorzystując do tego kody ANSI ale ja używam 24-bitowego emulatora &lt;strong&gt;st&lt;/strong&gt;, który domyślnie nie obsługuje tej funkcji.&lt;/p&gt;
&lt;p&gt;Na szczęście znalazłem patch: &lt;a class="reference external" href="https://st.suckless.org/patches/osc_1011"&gt;https://st.suckless.org/patches/osc_1011&lt;/a&gt;12/ po zaaplikowaniu którego można już robić to samo co w xtermie.&lt;/p&gt;
&lt;p&gt;Zabarwienie kursora na czerwono sprowadza się do paru linijek w .vimrc:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
if &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;term =~ "xterm\\|rxvt\\|st"
  " use an orange cursor in insert mode
  let &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;t_SI = "\&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Esc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;]12;orange\x7"
  " use a red cursor otherwise
  let &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;t_EI = "\&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Esc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;]12;red\x7"
  silent !echo -ne "\033]12;red\007"
  " reset cursor when vim exits
  autocmd VimLeave * silent !printf "\033c"
  " use \003]12;gray\007 for gnome-terminal
endif
&lt;/pre&gt;
&lt;p&gt;Ważna linia to ta, zawierająca "VimLeave", uruchamia ona sekwecję przywracającą domyślne ustawieia. Gdyby jej zabrakło, po wyjściu z VIM-a kursor pozostałby czerwony.&lt;/p&gt;
&lt;p&gt;p.s. Wstrzymanie VIM-a (Ctrl+Z) pozostawia czerwony kursor, bawiłem się autokomendami związanymi z buforami ale skończyło się tragicznie.&lt;/p&gt;
&lt;p&gt;p.p.s. Przy okazji dowiedziałem się, że istnieje autokomenda:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
UserGettingBored&lt;span class="w"&gt;                &lt;/span&gt;When&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;presses&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;same&lt;span class="w"&gt; &lt;/span&gt;key&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;times.&lt;span class="w"&gt;
                                &lt;/span&gt;Just&lt;span class="w"&gt; &lt;/span&gt;kidding!&lt;span class="w"&gt; &lt;/span&gt;:-&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;
</content><category term="Shitz"></category></entry><entry><title>Samobójstwo Oświecenia</title><link href="https://scyzoryk.fubar.pl/samobojstwo-oswiecenia.html" rel="alternate"></link><published>2020-08-02T07:15:00+02:00</published><updated>2020-08-02T07:15:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-08-02:/samobojstwo-oswiecenia.html</id><summary type="html">&lt;p&gt;Czy biorąc się za naprawę komputera odrzuciłbyś proste narzędzia jak wkrętak czy szczypce, a skupił wyłącznie na oscyloskopie?&lt;/p&gt;
&lt;p&gt;Czy warto czytać książkę do ostatniej kartki kiedy wie się już co będzie dalej albo jaka jest odpowiedź na główne pytanie?&lt;/p&gt;
&lt;p&gt;Stanąłem przed tym drugim dylematem po przeczytaniu kawałka słowa wstępnego wczoraj …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Czy biorąc się za naprawę komputera odrzuciłbyś proste narzędzia jak wkrętak czy szczypce, a skupił wyłącznie na oscyloskopie?&lt;/p&gt;
&lt;p&gt;Czy warto czytać książkę do ostatniej kartki kiedy wie się już co będzie dalej albo jaka jest odpowiedź na główne pytanie?&lt;/p&gt;
&lt;p&gt;Stanąłem przed tym drugim dylematem po przeczytaniu kawałka słowa wstępnego wczoraj kupionej książki "Samobójstwo Oświecenia", napisanej przez Andrzeja Zybertowicza z zespołem.&lt;/p&gt;
&lt;p&gt;A leci to mniej więcej tak:&lt;/p&gt;
&lt;p&gt;"&lt;strong&gt;Głównym zadaniem niniejszej książki miała być odpowiedź na pytanie: co ustalenia szeroko rozumianej neuronauki znaczą dla podstaw nauk społecznych i cywilizacji współczesnej?&lt;/strong&gt;"&lt;/p&gt;
&lt;p&gt;"Czy neuronauka, zajmująca się przecież mechanizmami pracy umysłu człowieka, daje nam istotnie nowy wgląd w to, w jaki sposób poznajemy i pojmujemy świat?"&lt;/p&gt;
&lt;p&gt;"Czy ta dyscyplina wiedzy, która bada ludzki umysł nie w trybie introspekcji i filozoficznych spekulacji, a metodami zmatematyzowanych i stechnicyzowanych nauk przyrodniczych, metodami uznawanymi za znacznie mniej zawodne od stosowanych w naukach społecznych, może wreszcie dać nam gruntowny, obiektywny wgląd w naturę człowieka? Czy dzięki neuronauce uzyskamy lepszy, gdyż na 'twardych' faktach ugruntowany wgląd w to, kim-naprawdę-jesteśmy?"&lt;/p&gt;
&lt;p&gt;Czytać dalej czy nie czytać?&lt;/p&gt;
&lt;p&gt;O! To doskonałe pytanie - powiedziałby zdrajca Maleszka.&lt;/p&gt;
&lt;p&gt;p.s. W podtytule jest podpowiedź.&lt;/p&gt;
</content><category term="Nauka"></category><category term="nauka"></category></entry><entry><title>Arduino: gra "Minutka"</title><link href="https://scyzoryk.fubar.pl/arduino-gra-minutka.html" rel="alternate"></link><published>2020-07-30T23:22:00+02:00</published><updated>2020-07-30T23:22:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2020-07-30:/arduino-gra-minutka.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Powyższy obrazek powstał z dwóch, pobranych z Internetu, sklejonych i obrobionych w GIMP-ie na Debianie. Efekt zdjęcia na Allegro (przedmiot na dywanie oświetlony słońcem z balkonu) po użyciu: Filters -&amp;gt; Light and Shadow -&amp;gt; Lighting Effects. ;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dwa lata temu bawiłem się na Arduino UNO (poszedłem na Giełdę Elektroniczną po jakieś styki, obejrzałem …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Powyższy obrazek powstał z dwóch, pobranych z Internetu, sklejonych i obrobionych w GIMP-ie na Debianie. Efekt zdjęcia na Allegro (przedmiot na dywanie oświetlony słońcem z balkonu) po użyciu: Filters -&amp;gt; Light and Shadow -&amp;gt; Lighting Effects. ;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dwa lata temu bawiłem się na Arduino UNO (poszedłem na Giełdę Elektroniczną po jakieś styki, obejrzałem RPi3 i... kupiłem oryginalne UNO) w "programowanie".&lt;/p&gt;
&lt;p&gt;Napisałem jakieś badziewie odgrywające tytułową muzykę z badziewnej spaceopery o Imperatorze i odzianych w skóry Rebeliantach. W końcu dokupiłem 7-segmentowy wyświetlacz i... nie miałem pojęcia co na nim wyświetlać.&lt;/p&gt;
&lt;p&gt;To moje przekleństwo, że większość projektów na IOT uważam za niepotrzebne zawracanie gitary. Bo do czego przyda się komuś pianinko, w którym klawiszami są owoce cytrusowe? Albo tagowanie samego siebie, żeby się światło zapalało jak wejdę do pokoju?&lt;/p&gt;
&lt;p&gt;Zrobiłem termometr z barometrem ale po chwili stwierdziłem, że niczego nie uprawiam, jaka pogoda widać za oknem, no to po kiego diabła mi to urządzenie?&lt;/p&gt;
&lt;p&gt;I wtedy Gracz Niezawodny zasugerował, żeby zrobić z Arduino to, do czego wyłącznie nadają się komputery: grę!&lt;/p&gt;
&lt;p&gt;Zasady są w kodzie. Wersja dla dwóch graczy.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
/* Gra "Minutka"
   Pomysł: Antek Kaczor
   Realizacja: Paweł Kaczor

   Gra polega na wyliczeniu "w myślach" kiedy upłynie jedna minuta.
   Gracze naciskają swoje przyciski kiedy uważają, że nadszedł właściwy
   czas. Arduino zapamiętuje czas naciśnięcia i numer gracza.
   Gdy ostatni gracz przyciśnie swój przycisk, program wybiera czas
   najbliższy jednej minucie, sprawdza który gracz zwyciężył i zapala
   jego diodę.
   W program użyłem biblioteki SevSeg, ułatwiającej zabawę
   z 7-segmentowym wyświetlaczem.
*/

#include "SevSeg.h"

SevSeg sevseg;               // obiekt wyświetlacza
int pushButton = 18;         // pin Analog 4 - tu jest testowy przycisk
static int wynik1 = 0;       // wynik pierwszego gracza
#define interval 6000        // jedna minuta
unsigned long previousMillis=0;
float diffMillis=0;          // różnica między zapamiętanymi
                             // a obecnymi millisami
float gracz1=0;
float gracz2=0;
int ileRazy=0;      // ile razy gramy?
float winner;

void saveTimer(unsigned long currentMillis){
    diffMillis = currentMillis - previousMillis;
    if (ileRazy == 0) {
      gracz1 = diffMillis;
      ileRazy++;
    } else if (ileRazy == 1) {
      gracz2 = diffMillis;
      ileRazy++;
    } else if (ileRazy == 2) {
      winner = max(gracz1, gracz2);
    }
      if (diffMillis &amp;gt; 5000) {  // nie sprawdzam poniżej 5 sek.
                                // od poprzedniego naciśnięcia
                                // (tyle też trwa wyświetlenie)
          Serial.print("Roznica wynosi: ");
          Serial.print(currentMillis);
          Serial.print(" - ");
          Serial.print(previousMillis);
          Serial.print(" = ");
          Serial.print(diffMillis);
          Serial.print(" czyli ");
          Serial.print(diffMillis / 1000);
          Serial.println(" sekund.");
          Serial.print("ileRazy: ");
          Serial.println(ileRazy);
          Serial.print("gracz1: ");
          Serial.println(gracz1);
          Serial.print("gracz2: ");
          Serial.println(gracz2);
          Serial.print("And the Winner is: ");
          Serial.println(winner);
          previousMillis = currentMillis;
          sevseg.setNumber(diffMillis/1000, 0);
      }
}

void setup() {
  pinMode(pushButton, INPUT_PULLUP);
  // Konsola debugowania ;)
  Serial.begin(9600);
  delay(1000);  // czekam 1s na zainicjowanie Seriala
  Serial.println("Startuję...");
  // Ustawienia 7-segmentowego wyświetlacza
  byte numDigits = 4;
  byte digitPins[] = {2, 3, 4, 5};
  byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6};
  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
  sevseg.setBrightness(90);
}

void loop() {
  unsigned long currentMillis = millis();
  if (digitalRead(pushButton) == HIGH) {
    saveTimer(currentMillis);
    sevseg.refreshDisplay(); // Must run repeatedly
   } else {
    // Serial.println(currentMillis);
   }
}
&lt;/pre&gt;
</content><category term="Games"></category><category term="arduino"></category><category term="gry"></category></entry><entry><title>Jump if Equal to Zero (tis-100)</title><link href="https://scyzoryk.fubar.pl/jump-if-equal-to-zero-tis-100.html" rel="alternate"></link><published>2020-07-30T22:03:00+02:00</published><updated>2020-07-30T22:03:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-07-30:/jump-if-equal-to-zero-tis-100.html</id><summary type="html">&lt;p&gt;Jestem uziemiony, a w tym uziemieniu zmieniam się w Miauczyńskiego. Adasia Miauczyńskiego. Jak ów nieszczęśnik układam nogi po siedem razy, szukając odpowiedniej pozycji, w której nie boli. Jestem żałosny, a dziś w dodatku skręciłem nogę.&lt;/p&gt;
&lt;p&gt;Z nudów i bólu wyję i tylko, niestety, tabletka daje parugodzinny, mglisty odpoczynek. Nie ma …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Jestem uziemiony, a w tym uziemieniu zmieniam się w Miauczyńskiego. Adasia Miauczyńskiego. Jak ów nieszczęśnik układam nogi po siedem razy, szukając odpowiedniej pozycji, w której nie boli. Jestem żałosny, a dziś w dodatku skręciłem nogę.&lt;/p&gt;
&lt;p&gt;Z nudów i bólu wyję i tylko, niestety, tabletka daje parugodzinny, mglisty odpoczynek. Nie ma jednak nic za darmo bo usypia. I w takiej, utkanej z maligny subwersji życia, próbuję chwycić się rzeczywistości poprzez logikę i matematykę. Grać w TIS-a usiłuję.&lt;/p&gt;
&lt;p&gt;W segmencie 31904, który jest siódmym (tak!!! siódmym!!!) z kolei i nosi nazwę "SEQUENCE COUNTER", na wejściu dostaję, zakończone zerami, ciągi liczb. Na wyjściu podać mam sumę i długość każdego ciągu. Zabrałem się za TIS-owego assemblera, a ten mi figla spłatał. Komenda JEZ (tytułowe: Jump if Equal to Zero) ma skoczyć do etykiety w programie, kiedy w ACC (akumulator) znajduje się zero.&lt;/p&gt;
&lt;p&gt;A u mnie skacze przy 35.&lt;/p&gt;
&lt;p&gt;O! Proszę bardzo:&lt;/p&gt;
&lt;div class="float wp-block-video docutils container"&gt;
&lt;video controls="" preload="auto" src="/uploads/2020/07/tis-100-babol.mp4"&gt;&lt;/video&gt;&lt;/div&gt;
&lt;p&gt;Nogi opadają!&lt;/p&gt;
&lt;p&gt;Eeee... doczytałem manual, po instrukcji JEZ nie ma innej instrukcji więc procesor wykonuje następną linię kodu. Wystarczy dodać po linii z JEZ np. skok na początek i wszystko gra:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
  JEZ SUM
  JMP START
SUM:
&lt;/pre&gt;
&lt;p&gt;Głupota mnie ogarnia.&lt;/p&gt;
</content><category term="Games"></category><category term="programowanie"></category><category term="komunikacja"></category><category term="rozrywka"></category></entry><entry><title>Diss dla Windows</title><link href="https://scyzoryk.fubar.pl/diss-dla-windows.html" rel="alternate"></link><published>2020-07-14T20:15:00+02:00</published><updated>2020-07-14T20:15:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-07-14:/diss-dla-windows.html</id><summary type="html">&lt;p&gt;Lekarz zabronił mi stykać się z systemem operacyjnym Windows - powyżej skan. O powodach później, opowiem o objawach.&lt;/p&gt;
&lt;p&gt;Początkowo nie kojarzyłem dwóch faktów: przebywania w tym samym pomieszczeniu w którym znajdował się komputer z uruchomionym Windows i narastającemu napięciu. Przez wiele lat nieuświadamiałem sobie, że swoim zachowaniem wzniecam konflkty i wywołuję …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Lekarz zabronił mi stykać się z systemem operacyjnym Windows - powyżej skan. O powodach później, opowiem o objawach.&lt;/p&gt;
&lt;p&gt;Początkowo nie kojarzyłem dwóch faktów: przebywania w tym samym pomieszczeniu w którym znajdował się komputer z uruchomionym Windows i narastającemu napięciu. Przez wiele lat nieuświadamiałem sobie, że swoim zachowaniem wzniecam konflkty i wywołuję zgorszenie obelżywą mową. Ciężko było o korelację bo kontakt z Windowsem był gęsto przeplatany, miłym mi, kontaktem z Linuksem lub innymi odmianami systemów *nixopodnych. Skąd, głupi, mogłem wiedzieć, że psychiczna wysypka bierze się z produktów z Redmond?&lt;/p&gt;
&lt;p&gt;W końcu, jakaś cząstka racjonalności, jaka się jeszcze ostała w skażonych czeluściach umysłu, połączyła fakty i stała się... JASNOŚÄ†!&lt;/p&gt;
&lt;p&gt;Pobiegłem do lekarza zawodowego: opisałem objawy, podparłem obserwacjami i odkryłem swoje podejrzenia.&lt;/p&gt;
&lt;p&gt;Nie uwierzył.&lt;/p&gt;
&lt;p&gt;Nie podjąłem próby przekonywania niedowiarka. Znalazłem innego ale ten również "nie widział korelacji". Potem był trzeci, czwarty, po piątym przestałem liczyć.&lt;/p&gt;
&lt;p&gt;Wreszcie, w zupełnie przypadkowym miejscu, na zupełnie przypadkowej imprezie poznałem człowieka, który zaufał moim spostrzeżeniom. Więcej! Sam zauważał podobne reakcje u siebie lecz o słabszej amplitudzie. Mój nowo poznany znajomy okazał się być lekarzem. Cóż z tego, że weterynarii?&lt;/p&gt;
&lt;p&gt;Ah, miałem napisać coś o objawach ale zamilknę, niech lekarskie orzeczenie będzie moim adwokatem.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Zaświadczenie o niezdolności do pracy z Windows" src="/uploads/2020/07/zaświadczenie-700x948.jpg"/&gt;
&lt;/div&gt;
&lt;p&gt;Jestem jeszcze zdezorientowany i w trakcie długotrwałej rehabilitacji, wybaczcie więc, że do tego momentu zwlekałem z ujawieniem powodów.&lt;/p&gt;
&lt;p&gt;Otóż, można je streścić w kilku zdaniach, a o ich prawdziwości niech świadczy doświadczenie każdego z Was, drodzy Czytelnicy.&lt;/p&gt;
&lt;p&gt;Windows jest &lt;a class="reference external" href="http://catb.org/jargon/html/B/BAD.html"&gt;B.A.D.&lt;/a&gt; , jest zły, zły, zły i niedobry, wtedy gdy ma działać to nie działa, wtedy kiedy jest potrzebny to robi update, kiedy skończy update - to co działało, działać przestaje, zżera miejsce na dysku, komunikaty o błędach (bo sukcesów brak) więcej zaciemniają niż pomagają, nie da się go obsłużyć bez wielkiego manuala jakim jest 90% Internetu, która nie jest pornografią, sam Windows jest pornografią, ogłupia swoich użytkowników do tego stopnia, że trudno im zdalnie pomóc, bo no jak pomóc komuś mówiąc przez pół godziny, żeby w kliknął w coś w dolnym, lewym czy prawym rogu?, a gdy kliknie to się okazuje, że i tak to nie ta wersja, jest jednym wielkim workiem na wirusy, twórcy wirusów już dawno powinni się zlitować nad tą pomyłką i wyposażać swoje dzieła w funkcje naprawcze, gdy jako osesek zainstalowałem Windows 3.11 pod OS/2 to działał lepiej niż goły na tym samym sprzęcie, co jest dowodem, że można trochę tę POMYŁKĘ naprawić, ale po co poprawiać skoro są alternatywy?, gdy obserwuję zmiany w Windows to mam pełną świadomość, że jego twórcy też już wiedzą (brawo za orientację) jaki BABOL wypuścili, więc za 100 lat Windows będzie Linuksem, skoro już wam to powiedziałem drodzy developerzy to zróbcie, błagam, czasoskok i nadpiszcie swój kod, kodem kernela w wersji 4.9.118, wyjdzie nam i wam na dobre.&lt;/p&gt;
&lt;p&gt;Skończyłem.&lt;/p&gt;
</content><category term="Shitz"></category><category term="windows"></category><category term="systemy"></category><category term="shitz"></category></entry><entry><title>Kernel: Debian i Macbook Pro 11,3 (Retina, 15-inch, Mid 2014)</title><link href="https://scyzoryk.fubar.pl/kernel_debian_macbook.html" rel="alternate"></link><published>2020-06-11T22:21:00+02:00</published><updated>2020-06-11T22:21:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-06-11:/kernel_debian_macbook.html</id><summary type="html">&lt;p&gt;Artykuł opisujący instalację i dopieszczanie Linuksa, a konkretniej: Debiana, na Apple Macbooku Pro (jak w tytule), mam od dawna w szufladzie i od czasu do czasu dopisuję w nim kolejne rozdziały. Czas na release...&lt;/p&gt;
&lt;p&gt;Przedstawię go wspak bo wyszło tak. A poważnie, to po prostu dziś rano nastąpiło zwieńczenie dzieła …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Artykuł opisujący instalację i dopieszczanie Linuksa, a konkretniej: Debiana, na Apple Macbooku Pro (jak w tytule), mam od dawna w szufladzie i od czasu do czasu dopisuję w nim kolejne rozdziały. Czas na release...&lt;/p&gt;
&lt;p&gt;Przedstawię go wspak bo wyszło tak. A poważnie, to po prostu dziś rano nastąpiło zwieńczenie dzieła czyli skompilował się własny kernel i pierwszą rzeczą, która naprawdę mnie zachwyciła, że w 6-letni laptop, wprawdzie z silną konfiguracją, wstąpiło nowe życie.&lt;/p&gt;
&lt;p&gt;Jeszcze z czasów kiedy moją ukochaną dystrybucją był Slackware pamiętam, że posiadanie waniliowego czyli oryginalnego jajka było prawie hańbą. Po instalacji systemu pierwszą rzeczą była konfiguracja i kompilacja własnego kernela. Zabawa, w pierwszym rzędzie polegała na usunięciu wszystkich, zbędnych sterowników. Chodziło nie tylko o zmniejszenie pamięciożerności kernela ale i o prozaiczne skrócenie czasu kompilacji - zasada jest prosta: im mniej modułów tym mniej do kompilacji. Przy starszych maszynach miało to niebagatelne znaczenie, przecież dziś na moim i7 Turbo Boost do 3,7GHz jądro kompilowało się około 1,5 odcinka serialu "Daleko od szosy".&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Kto dziś kompiluje jądro? Mam wrażenie, że niewiele osób. Bo i po co? Maszyny są na tyle mocne, że na jajku z dystrbucji ostro zasuwają, a używanie własnego kernela wiąże się z jedną, upierdliwą niedogodnością: koniec z automatycznym uaktualnianiem kernela.&lt;/div&gt;
&lt;div class="line"&gt;DISCLAIMER: piszę to bazując na manualu Debiana, nie sprawdzałem jak jest naprawdę. Podejrzewam, że spokojnie można ten proces zautomatyzować ale z pewnością będzie to zupełnie coś innego niż uruchomienie: apt update ; apt dist-upgrade.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;mkdir ~/kernel&lt;/p&gt;
&lt;p&gt;Konfiguracja kernela to proces ŻMUDNY ale NIE TRUDNY, i można go sobie przynajmniej trochę ułatwić zaczynając od konfiguracji dostarczonej wraz z dystrybucją. Jest to o tyle dobry początek, że mamy konfigurację działającą na naszym sprzęcie, skoro na nim konfigurujemy to znaczy, że działa. :)&lt;/p&gt;
&lt;p&gt;Konfiguracja aktualnie zainstalowanego kernela (czyli tego z paczki) w Debianie zapisana jest w pliku znajdującym się w folderze /boot, którego nazwa rozpoczyna się od słowa 'config' po którym występuje numer wersji i rodzaj architektury. W moim przypadku był to plik: /boot/config-4.19.0-8-amd64.&lt;/p&gt;
&lt;p&gt;Skopiowałem go jako konfigurację startową:&lt;/p&gt;
&lt;p&gt;cd ~/kernel ; cp /boot/config-4.19.0-8-amd64 ./linux-source-4.19/.config&lt;/p&gt;
&lt;p&gt;Po coś dodałem ten firmware, chyba srało jakimiś błedami, do sprawdzenia:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://ftp.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-misc-nonfree_20190717-2_all.deb"&gt;http://ftp.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-misc-nonfree_20190717-2_all.deb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adnotacja z 2026: wpis nigdy nie dokończony&lt;/strong&gt;&lt;/p&gt;
</content><category term="Wypociny"></category><category term="nostalgia"></category></entry><entry><title>Hackowanie modemu bursztynem podlane</title><link href="https://scyzoryk.fubar.pl/hackowanie-modemu-bursztynem-podlane.html" rel="alternate"></link><published>2020-06-10T22:17:00+02:00</published><updated>2020-06-10T22:17:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-06-10:/hackowanie-modemu-bursztynem-podlane.html</id><summary type="html">&lt;p&gt;Gdzieś około 1986 roku zabrano mnie i kilku kolegów do Huty Stalowa Wola (HSW) na tzw. praktyki. Praktyka powinna być prawdziwym zetknięciem z później wykonywanym zawodem ale w socj(opato)alistycznej rzeczywistości PRL-u była próbą wepchnięcia młodzieży w sytuację pt. "Co my z wami mamy zrobić?".&lt;/p&gt;
&lt;p&gt;Historia pokazał jednak, że …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Gdzieś około 1986 roku zabrano mnie i kilku kolegów do Huty Stalowa Wola (HSW) na tzw. praktyki. Praktyka powinna być prawdziwym zetknięciem z później wykonywanym zawodem ale w socj(opato)alistycznej rzeczywistości PRL-u była próbą wepchnięcia młodzieży w sytuację pt. "Co my z wami mamy zrobić?".&lt;/p&gt;
&lt;p&gt;Historia pokazał jednak, że w moim przypadku, z całej klasy tylko moim, było to rzeczywiście zetknięcie z, może nie przyszłym zawodem, ale bardziej wannabe hobby. A było to tak...&lt;/p&gt;
&lt;p&gt;Pan inżynier, który przejął nad nami opiekę w jednym z działów HSW (biuro znajdowało się chyba w samej Dyrekcji Głównej), zostawił kilku z nas, w tym i mnie, sam na sam z bursztynowymi terminalami komputerowymi. Był to dla mnie mega-podniecający szok technologiczny!&lt;/p&gt;
&lt;p&gt;Zaraz, zaraz... zanim nas zostawił to wyjaśnił, że terminale podłączone są do czarnej skrzynki, modemu, a modem pozwala im komunikować się z komputerem w dziale informatycznym. Dziś wiem, że w owym dziale mieścił się mainframe S/370.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="IBM mainframe" src="/uploads/2020/06/ibm-mainframe-700x489.jpg"/&gt;
&lt;/div&gt;
&lt;p&gt;Byliśmy jak dzieci, ciekawi, odważni i zdeterminowani. Nie pamiętam dokładnie co zrobiliśmy ale przełamaliśmy jakąś blokadę i zaczęli wdzwaniać bezpośrednio do zdalnego systemu. Pan inżynier usłyszał nasze podniecone okrzyki albo dźwięki z modemu i pędem wpadł do pomieszczenia, z którego, widząc nasze wysiłki, po prostu nas wyrzucił.&lt;/p&gt;
&lt;p&gt;To było tylko potwierdzenie sukcesu, bardzo nas rozbawiło i wbiło w dumę. Żaden z nas nie znał słowa "hacker". Wszystko zrobiliśmy intuicyjnie.&lt;/p&gt;
&lt;p&gt;Do dziś pamiętam bursztynową poświatę terminala. Te same monitory spotkałem potem wiele razy przy pracy na PC-tach firmy Elwro, no i czuję nostalgię.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Elwro" src="/uploads/2020/06/elwro-700x525.jpg"/&gt;
&lt;/div&gt;
&lt;p&gt;A dziś znalazłem coś przepięknego! Emulator terminala z moim ukochanym bursztynem... i zacząłem na nim pracować. Zamierzam poprawić na nim kod w PHP-ie.&lt;/p&gt;
&lt;p&gt;To cudo jest tu: &lt;a class="reference external" href="https://github.com/Swordfish90/cool-retro-term"&gt;Cool Retro Term&lt;/a&gt;.&lt;/p&gt;
&lt;div class="float wp-block-video docutils container"&gt;
&lt;video autoplay="" controls="" loop="" src="/uploads/2020/06/movie.mp4"&gt;&lt;/video&gt;&lt;/div&gt;
</content><category term="Historia komputerów"></category><category term="komunikacja"></category><category term="sprzęt"></category><category term="nostalgia"></category><category term="emulator"></category></entry><entry><title>99 butelek piwa w Pythonie</title><link href="https://scyzoryk.fubar.pl/99-butelek-piwa-w-pythonie.html" rel="alternate"></link><published>2020-06-08T02:07:00+02:00</published><updated>2020-06-08T02:07:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-06-08:/99-butelek-piwa-w-pythonie.html</id><summary type="html">&lt;p&gt;Znalazłem gdzieś zadanie wygenerowania tekstu piosenki o 99 piwach. To odmiana harcerskiej piosenki, której nauczył mnie Gospodarczyk o Winnteou. Piosenka ta odratowała moje chore gardło i szkolna wycieczka się udała.&lt;/p&gt;
&lt;p&gt;Kod jest krótki ale czuję, że może być jeszcze krótszy gdyby się przyłożył do przypadków specjalnych. Przypomina mi to obecnie …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Znalazłem gdzieś zadanie wygenerowania tekstu piosenki o 99 piwach. To odmiana harcerskiej piosenki, której nauczył mnie Gospodarczyk o Winnteou. Piosenka ta odratowała moje chore gardło i szkolna wycieczka się udała.&lt;/p&gt;
&lt;p&gt;Kod jest krótki ale czuję, że może być jeszcze krótszy gdyby się przyłożył do przypadków specjalnych. Przypomina mi to obecnie aktualny temat formantów, cząstek występujących w słowotwórstwie. Temat aktualny bo przed nami egzamin ósmoklasisty.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
def tens(t):
    tt = ("","twenty","thirty","fourty","fifty","sixty","seventy","eighty","ninety")
    return tt[int(t)-1]
def ones(o):
    oo = ("","one","two","three","four","five","six","seven","eight","nine")
    return oo[int(o)]
def spell(x):
    if len(str(x))==2:
        if str(x) == '20':
            return "twenty" , "nineteen"
        if str(x) == '15':
            return "fifteen" , "fourteen"
        elif str(x) == '13':
            return "thirteen", "twelve"
        elif str(x) == '12':
            return "twelve", "eleven"
        elif str(x) == '11':
            return "eleven", "ten"
        elif str(x) == '10':
            return "ten", "nine"
        else:
            if str(x)[0] == '1':
                z = str(ones(str(x)[1])+'teen').replace(" ","")
                y = str(ones(str(x-1)[1])+'teen').replace(" ","")
                return z, y
            else:
                z = tens(str(x)[0]) + "-" + ones(str(x)[1])
                y = tens(str(x-1)[0]) + "-" + ones(str(x-1)[1])
                return z, y
    else:
        z = ones(x)
        y = ones(x-1)
        return z, y

for i in range(99,0,-1):
    print spell(i)[0].title(),'bottles of beer on the wall,',spell(i)[0].title(),' bottles of beer. Take one down and pass it around -',spell(i)[1].title(),' bottles of
beer on the wall.'
&lt;/pre&gt;
</content><category term="Programowanie"></category><category term="python"></category><category term="programowanie"></category></entry><entry><title>Advent of Code dzień 3</title><link href="https://scyzoryk.fubar.pl/advent-of-code-dzien-3.html" rel="alternate"></link><published>2020-06-08T01:54:00+02:00</published><updated>2020-06-08T01:54:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-06-08:/advent-of-code-dzien-3.html</id><summary type="html">&lt;p&gt;Wyjmuję z historii zaległości. Tym razem AoC zdaje się, że z 2018 roku ale pewności nie mam.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/usr/bin/python

import sys, getopt
from copy import deepcopy

def laziMikolaj(plik):
    # pierwotna tablica zbierajaca wszystkie adresy
    adresy = []
    # aktualny adres Mikolaja
    currAdr= [0,0]
    adresy.append(deepcopy(currAdr)) # pierwszy adres jest pierwszy …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;Wyjmuję z historii zaległości. Tym razem AoC zdaje się, że z 2018 roku ale pewności nie mam.&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/usr/bin/python

import sys, getopt
from copy import deepcopy

def laziMikolaj(plik):
    # pierwotna tablica zbierajaca wszystkie adresy
    adresy = []
    # aktualny adres Mikolaja
    currAdr= [0,0]
    adresy.append(deepcopy(currAdr)) # pierwszy adres jest pierwszy
    # tablica zliczajaca ilosc odwiedzin
    wizyty = []
    # licze sobie ile razy robil skrecal
    up=0
    right=0
    down=0
    left=0
    # ile razy odwiedzil tylko raz
    ileRaz = 1
    # otwieram plik z danymi
    with open('day3', 'r') as myfile:
        data=myfile.read().replace('\n', '')
    # iteruje znak po znaku
    for i in range(0, len(data)):
        if data[i] == '^':
                currAdr[1]      += 1
                up += 1
        elif data[i] == '&amp;gt;':
                currAdr[0]      += 1
                right += 1
        elif data[i] == 'v':
                currAdr[1]      -= 1
                down += 1
        elif data[i] == '&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;':
                currAdr[0]      -= 1
                left += 1
    #   print "i = %d" % i
    #   print currAdr
    # zbieram aktualne adresy do glowej tablicy
        adresy.append(deepcopy(currAdr))
    # sortowanie po wspolrzednej X
    adx=sorted(adresy,key=lambda x: x[0])
    # sortowanie po wspolrzednej Y
    bdx=sorted(adx,key=lambda x: x[1])
    prevX = bdx[0][0] # poprzedniego nie ma wiec jest nim pierwszy
    prevY = bdx[0][1] # j.w.
    zmiana = 1
    for i in range(0, len(bdx)):
        x = bdx[i][0]
        y = bdx[i][1]
        if x == prevX and y == prevY:
            if zmiana == 1:
                ileRaz -= 1
                zmiana = 0
#                 print "zmiana z 1 na 0"
#             print "----------------------------------------------------------"
#             print "Obecnie:   %d:     %s" % (i, bdx[i])
#             print "Poprzednio:                %d, %d, ileRaz = %d" % (prevX, prevY, ileRaz)
        else:
            zmiana = 1
#             print "zmiana z 0 na 1"
            ileRaz += 1
#             print "----------------------------------------------------------"
#             print "Obecnie:   %d:     %s" % (i, bdx[i])
#             print "Poprzednio:        ***     %d, %d, ileRaz = %d" % (prevX, prevY, ileRaz)
            prevX = x
            prevY = y
    #print "Adresy: %s" % adresy
    print "Adresy ma %s elementow" % len(adresy)
    print "Up: %s" % up
    print "Right: %s" % right
    print "Down: %s" % down
    print "Left: %s" % left
    #print "bdx: %s" % bdx
    print "Pojedynczych prezentow bylo: %d" % ileRaz

def main(argv):
    inputfile = ''
    try:
        opts, args = getopt.getopt(argv,"hi:o:",["ifile="])
    except getopt.GetoptError:
        print 'test.py -i &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;inputfile&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;'
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            print 'test.py -i &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;inputfile&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;'
            sys.exit()
        elif opt in ("-i", "--ifile"):
            inputfile = arg
            laziMikolaj(inputfile)

if __name__ == "__main__":
    main(sys.argv[1:])
&lt;/pre&gt;
&lt;p&gt;I drugie zadanie z tego dnia:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
#!/usr/bin/python
import sys, getopt
import itertools
from copy import deepcopy

def lazi(plik,start, step):
    # pierwotna tablica zbierajaca wszystkie adresy
    adresy = []
    # aktualny adres Mikolaja
    currAdr= [0,0]
    # pierwszy adres jest pierwszy ;)
    adresy.append(deepcopy(currAdr))
    # tablica zliczajaca ilosc odwiedzin
    wizyty = []
    # otwieram plik z danymi
    with open(plik, 'r') as myfile:
        data=myfile.read().replace('\n', '')
    # iteruje znak po znaku
    for i in range(start, len(data), step):
        if data[i] == '^':
                currAdr[1]      += 1
        elif data[i] == '&amp;gt;':
                currAdr[0]      += 1
        elif data[i] == 'v':
                currAdr[1]      -= 1
        elif data[i] == '&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;':
                currAdr[0]      -= 1
        # zbieram aktualne adresy do glowej tablicy
        adresy.append(deepcopy(currAdr))
    return adresy

def zlicz(lazik, adresy):
    unique = [k for k,g in itertools.groupby(sorted(adresy))]
    #print "Adresy: %s" % adresy
    print "Lazil: %s" % lazik
    print "Adresy ma %s elementow" % len(adresy)
    print "Pojedynczych prezentow bylo: %d" % len(unique)
    return len(unique)

def main(argv):
    inputfile = ''
    try:
        opts, args = getopt.getopt(argv,"hi:o:",["ifile="])
    except getopt.GetoptError:
        print 'test.py -i &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;inputfile&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;'
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            print 'test.py -i &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;inputfile&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;'
            sys.exit()
        elif opt in ("-i", "--ifile"):
            inputfile = arg
            Miki    = lazi(inputfile, 0, 2)
            Robot   = lazi(inputfile, 1, 2)
            Razem   = Miki + Robot
            razem = zlicz("Razem", Razem)
            print "Razem: %d" % razem

if __name__ == "__main__":
    main(sys.argv[1:])
&lt;/pre&gt;
</content><category term="Games"></category><category term="python"></category><category term="games"></category></entry><entry><title>IRQ hogging CPU czyli świński numer</title><link href="https://scyzoryk.fubar.pl/irq-hogging-cpu-czyli-swinski-numer.html" rel="alternate"></link><published>2020-06-07T22:42:00+02:00</published><updated>2020-06-07T22:42:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-06-07:/irq-hogging-cpu-czyli-swinski-numer.html</id><summary type="html">&lt;p&gt;W jakimś, zupełnie nieuświadomionym, momencie czasowym mój Macbook zaczął dyszeć. To nie było rzężenie padającego dysku ale ewidetne obciążenie układu płuco-serce. Wiatraki szalały, prąd znikał, a obudowa wskazywała na stan wysokiej gorączki.&lt;/p&gt;
&lt;p&gt;Uruchomienie top-a wykazało, że proces o proletariackiej nazwie kworker dosłownie pożera 60% czasu procesora. W nazwie procesu był …&lt;/p&gt;</summary><content type="html">&lt;p&gt;W jakimś, zupełnie nieuświadomionym, momencie czasowym mój Macbook zaczął dyszeć. To nie było rzężenie padającego dysku ale ewidetne obciążenie układu płuco-serce. Wiatraki szalały, prąd znikał, a obudowa wskazywała na stan wysokiej gorączki.&lt;/p&gt;
&lt;p&gt;Uruchomienie top-a wykazało, że proces o proletariackiej nazwie kworker dosłownie pożera 60% czasu procesora. W nazwie procesu był jeszcze przyrostek: kacpid, co wskazywało na podsystem ACPI czyli zarządzanie energią. Nic mi to nie mówiło.&lt;/p&gt;
&lt;p&gt;Internet podpowiedział mi, że chodzi o przerwania oraz fakt, że kworker zbyt często obsługuje któreś z nich i że należy podpowiedzieć ACPI, żeby sobie dał z tym spokój.&lt;/p&gt;
&lt;p&gt;I rzeczywiście, w moim przypadku, czyli Macbooku 11,3 chodziło o przerwanie numer 6. Co je generuje? Jeszcze nie wiem ale pewnie się dowiem bo pojawienie się tzw. sztormu GPE (GPE storm) to znak, że coś złego dzieje się ze sprzętem. Pisałem, że klapa (lid) przestała się domykać?&lt;/p&gt;
&lt;p&gt;Nie będę się rozwodził nad tematem bo obecnie interesuje mnie tylko likwidacja obciążenia procesora. A robi się to przez dodanie do systemowego crontaba (crontab -e) następującego wpisu:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
@reboot echo "disable" &amp;gt; /sys/firmware/acpi/interrupts/gpe06
&lt;/pre&gt;
&lt;p&gt;Przydatne linki:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot"&gt;https://unix.stackexchange.com/questions/242013/disable-gpe-acpi-interrupts-on-boot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.kernel.org/doc/ols/2005/ols2005v1-pages-59-76.pdf"&gt;https://www.kernel.org/doc/ols/2005/ols2005v1-pages-59-76.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Opis w j. ang.:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ACPI&lt;/strong&gt; is the &lt;a class="reference external" href="http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface"&gt;Advanced Configuration and Power Interface&lt;/a&gt;, which allows Ubuntu (or any OS) to communicate with your hardware in a standard manner. It's main function is power management, along with hardware device configuration.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;GPE&lt;/strong&gt; in ACPI is a &lt;em&gt;General Purpose Event&lt;/em&gt;. Think of it as an interrupt - the hardware is informing the OS (via ACPI) that &lt;em&gt;something&lt;/em&gt; happened. The "something" usually includes things like plugging/unplugging your AC adapter, closing/opening the lid of your laptop, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EC&lt;/strong&gt; is the &lt;em&gt;embedded controller&lt;/em&gt; which provides ACPI functions on your motherboard.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;GPE storm&lt;/strong&gt; occurs when the EC starts sending hundreds or thousands of "events" per second to the OS -- these are either spurious (bogus), or due to some fault in the underlying hardware. e.g. a failure in your battery's charging controller leads the ACPI EC to think that the battery is being removed and reinserted hundreds of times per second.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Transactions will use polling mode&lt;/em&gt; means that to handle the storm, the OS will &lt;em&gt;stop&lt;/em&gt; using GPEs/interrupts to be informed of ACPI events and will instead -- on its own schedule -- "poll" or proactively ask the ACPI EC if any events it should know of have occurred. This way, the OS can still effectively perform ACPI functions while not being overwhelmed with a "GPE storm".&lt;/p&gt;
</content><category term="Linux"></category><category term="bezpieczeństwo"></category><category term="systemy"></category><category term="administracja"></category></entry><entry><title>Bitwarden &amp; Qnap &amp; Docker</title><link href="https://scyzoryk.fubar.pl/bitwarden-on-qnap.html" rel="alternate"></link><published>2020-06-02T20:41:00+02:00</published><updated>2020-06-02T20:41:00+02:00</updated><author><name>admin</name></author><id>tag:scyzoryk.fubar.pl,2020-06-02:/bitwarden-on-qnap.html</id><summary type="html">&lt;p&gt;Będzie po angielsku bo może przyda się światu. ;)&lt;/p&gt;
&lt;p&gt;Short instruction how to run Bitwarden service on home Qnap NAS.&lt;/p&gt;
&lt;p&gt;Install "Container Station" on your Qnap. On the left panel of" Container Station" click on "Create" button and then on "Create Application" in upper right corner of window. In the text …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Będzie po angielsku bo może przyda się światu. ;)&lt;/p&gt;
&lt;p&gt;Short instruction how to run Bitwarden service on home Qnap NAS.&lt;/p&gt;
&lt;p&gt;Install "Container Station" on your Qnap. On the left panel of" Container Station" click on "Create" button and then on "Create Application" in upper right corner of window. In the text input field put content of the following listing and name this new application "bitwarden".&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Bitwarden on QNAP" src="/uploads/2020/05/bw_qnap01.png"/&gt;
&lt;/div&gt;
&lt;pre class="code dockerfile literal-block"&gt;
version:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;services:&lt;span class="w"&gt;
&lt;/span&gt;bitwarden:&lt;span class="w"&gt;
 &lt;/span&gt;image:&lt;span class="w"&gt; &lt;/span&gt;bitwardenrs/server:latest&lt;span class="w"&gt;
 &lt;/span&gt;expose:&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"80"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;volumes:&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;./data/bitwarden:/data&lt;span class="w"&gt;
 &lt;/span&gt;restart:&lt;span class="w"&gt; &lt;/span&gt;on-failure&lt;span class="w"&gt;
 &lt;/span&gt;environment:&lt;span class="w"&gt;
   &lt;/span&gt;WEBSOCKET_ENABLED:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'true'&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;logging:&lt;span class="w"&gt;
   &lt;/span&gt;driver:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"json-file"&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;nginx:&lt;span class="w"&gt;
 &lt;/span&gt;image:&lt;span class="w"&gt; &lt;/span&gt;nginx:1.15-alpine&lt;span class="w"&gt;
 &lt;/span&gt;ports:&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"580:80"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5443:443"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;volumes:&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;./data/nginx:/etc/nginx&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;./data/ssl:/etc/ssl&lt;span class="w"&gt;

&lt;/span&gt;bw_backup:&lt;span class="w"&gt;
 &lt;/span&gt;image:&lt;span class="w"&gt; &lt;/span&gt;bruceforce/bw_backup:latest&lt;span class="w"&gt;
 &lt;/span&gt;container_name:&lt;span class="w"&gt; &lt;/span&gt;bw_backup&lt;span class="w"&gt;
 &lt;/span&gt;restart:&lt;span class="w"&gt; &lt;/span&gt;on-failure&lt;span class="w"&gt;
 &lt;/span&gt;depends_on:&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;bitwarden&lt;span class="w"&gt;
 &lt;/span&gt;volumes:&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;./data/bitwarden:/data&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;/etc/timezone:/etc/timezone:ro&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;/etc/localtime:/etc/localtime:ro&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;./data/bitwarden:/backup_folder/&lt;span class="w"&gt;
 &lt;/span&gt;environment:&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DB_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/data/db.sqlite3&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BACKUP_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/backup_folder/db_backup/backup.sqlite3&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BACKUP_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/data/db_backup/backup.sqlite3&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CRON_TIME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;false&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Accept it and run. What you have really done is Docker Compose YAML configuration file which pulls 3 images from Docker Hub server:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;bitwarden_rs - an unofficial Bitwarden server implemented in Rust language,&lt;/li&gt;
&lt;li&gt;nginx - web server required here as proxy for HTTPS requests,&lt;/li&gt;
&lt;li&gt;bw_backup - a docker image running cron job to backup bitwarden database.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and runs containers of them inside "Container Station".&lt;/p&gt;
&lt;p&gt;You should pay particular attention to the ports configuration, line with "580:80" and "5443:443" frases. "580" and "5443" are outside ports which are open on the Qnap itself. You can change to whatever fits for you but don't use 80, 443 or 8080 because they are already taken by Qnap own services.&lt;/p&gt;
&lt;p&gt;Before you run freshly created application (that's Qnap Container Station's name for docker-compose GUI) SSH log into Qnap and go to application folder:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="go"&gt;cd /share/Container/container-station-data/application/bitwarden/data&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Now, you must create configuration for nginx:&lt;/p&gt;
&lt;pre class="code nginx literal-block"&gt;
&lt;span class="k"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;http{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kn"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="k"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kn"&gt;listen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/ssl/certs/bitwarden.crt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/ssl/private/bitwarden.key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="kn"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://bitwarden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;X-Real-IP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Save it as nginx.conf to /share/Container/container-station-data/application/bitwarden/data/nginx folder.&lt;/p&gt;
&lt;p&gt;Now, you have to create self signed certificate to encrypt HTTP requests with SSL. To do this log in to Qnap with SSH and run following commands:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="go"&gt;git clone https://github.com/JulianRunnels/Bitwarden_Self_Host.git&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;In this repo you'll find two interesting files: &lt;strong&gt;data/ssl/bitwarden.ext&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code ini literal-block"&gt;
&lt;span class="c1"&gt;# OpenSSL root CA configuration file.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Copy to `/root/ca/openssl.cnf`.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ ca ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# `man ca`&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;default_ca&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;CA_default&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ CA_default ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Directory and file locations.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;./data/ssl&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;certs&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/certs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;crl_dir&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/crl&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;new_certs_dir&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/newcerts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/index.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;serial&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/serial&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;RANDFILE&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/private/.rand&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;# The root key and root certificate.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;private_key&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/private/myCA.key&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;certificate&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/certs/myCA.crt&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;# For certificate revocation lists.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;crlnumber&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/crlnumber&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;crl&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;$dir/crl/ca.crl.pem&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;crl_extensions&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;crl_ext&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;default_crl_days&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;30&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;# SHA-1 is deprecated, so use SHA-2 instead.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;default_md&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;sha256&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="na"&gt;name_opt&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ca_default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;cert_opt&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;ca_default&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;default_days&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;375&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;preserve&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;policy_strict&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ policy_strict ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# The root CA should only sign intermediate certificates that match.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# See the POLICY FORMAT section of `man ca`.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;match&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;stateOrProvinceName&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;match&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;organizationName&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;match&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;organizationalUnitName&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;commonName&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;supplied&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;emailAddress&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ policy_loose ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Allow the intermediate CA to sign a more diverse range of certificates.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# See the POLICY FORMAT section of the `ca` man page.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;stateOrProvinceName&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;localityName&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;organizationName&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;organizationalUnitName&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;commonName&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;supplied&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;emailAddress&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;optional&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ req ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Options for the `req` tool (`man req`).&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;default_bits&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;2048&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;distinguished_name&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;req_distinguished_name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;string_mask&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;utf8only&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;# SHA-1 is deprecated, so use SHA-2 instead.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;default_md&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;sha256&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;# Extension to add when the -x509 option is used.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;x509_extensions&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;v3_ca&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ req_distinguished_name ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Country Name (2 letter code)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;stateOrProvinceName&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;State or Province Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;localityName&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Locality Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;0.organizationName&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Organization Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;organizationalUnitName&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Organizational Unit Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;commonName&lt;/span&gt;&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Common Name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;emailAddress&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Email Address&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c1"&gt;# Optionally, specify some defaults.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;countryName_default&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;stateOrProvinceName_default&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;localityName_default&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;0.organizationName_default&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;organizationalUnitName_default&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;emailAddress_default&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ v3_ca ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Extensions for a typical CA (`man x509v3_config`).&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;subjectKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;hash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;authorityKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;keyid:always,issuer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;basicConstraints&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, CA:true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;keyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, digitalSignature, cRLSign, keyCertSign&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ v3_intermediate_ca ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Extensions for a typical intermediate CA (`man x509v3_config`).&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;subjectKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;hash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;authorityKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;keyid:always,issuer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;basicConstraints&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, CA:true, pathlen:0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;keyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, digitalSignature, cRLSign, keyCertSign&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ usr_cert ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Extensions for client certificates (`man x509v3_config`).&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;basicConstraints&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;CA:FALSE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;nsCertType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;client, email&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;nsComment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"OpenSSL Generated Client Certificate"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;subjectKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;hash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;authorityKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;keyid,issuer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;keyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, nonRepudiation, digitalSignature, keyEncipherment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;extendedKeyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;clientAuth, emailProtection&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ my_subject_alt_names ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;DNS.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;bitwarden.lan&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;DNS.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;www.bitwarden.lan&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ server_cert ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Extensions for server certificates (`man x509v3_config`).&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;basicConstraints&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;CA:FALSE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;nsCertType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;nsComment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"OpenSSL Generated Server Certificate"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;subjectKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;hash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;authorityKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;keyid,issuer:always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;keyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, digitalSignature, keyEncipherment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;extendedKeyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;serverAuth&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;subjectAltName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;@my_subject_alt_names&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ crl_ext ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Extension for CRLs (`man x509v3_config`).&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;authorityKeyIdentifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;keyid:always&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[ ocsp ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;# Extension for OCSP signing certificates (`man ocsp`).&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;basicConstraints&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;CA:FALSE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;subjectKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;hash&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;authorityKeyIdentifier&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;keyid,issuer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;keyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, digitalSignature&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;extendedKeyUsage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical, OCSPSigning&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;and script called &lt;strong&gt;create_ssl.sh&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
&lt;span class="ch"&gt;#!/bin/bash
&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;clear&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Creating directory structure for CA"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;data/ssl/certs&lt;span class="w"&gt;
&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;data/ssl/csr&lt;span class="w"&gt;
&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;data/ssl/private&lt;span class="w"&gt;
&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;data/ssl/newcerts&lt;span class="w"&gt;
&lt;/span&gt;touch&lt;span class="w"&gt; &lt;/span&gt;data/ssl/index.txt&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;data/ssl/serial&lt;span class="w"&gt;
&lt;/span&gt;clear&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Creating key for personal CA, please fill out the FQDN with the name you want for your CA"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;genrsa&lt;span class="w"&gt; &lt;/span&gt;-aes256&lt;span class="w"&gt; &lt;/span&gt;-out&lt;span class="w"&gt; &lt;/span&gt;data/ssl/private/myCA.key&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;data/ssl/private/myCA.key&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Creating personal CA"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;req&lt;span class="w"&gt; &lt;/span&gt;-config&lt;span class="w"&gt; &lt;/span&gt;data/ssl/bitwarden.ext&lt;span class="w"&gt; &lt;/span&gt;-x509&lt;span class="w"&gt; &lt;/span&gt;-new&lt;span class="w"&gt; &lt;/span&gt;-sha256&lt;span class="w"&gt; &lt;/span&gt;-days&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3650&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-extensions&lt;span class="w"&gt; &lt;/span&gt;v3_ca&lt;span class="w"&gt; &lt;/span&gt;-key&lt;span class="w"&gt; &lt;/span&gt;data/ssl/private/myCA.key&lt;span class="w"&gt; &lt;/span&gt;-out&lt;span class="w"&gt; &lt;/span&gt;data/ssl/certs/myCA.crt&lt;span class="w"&gt;
&lt;/span&gt;clear&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Creating key for bitwarden certificate"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;genrsa&lt;span class="w"&gt; &lt;/span&gt;-out&lt;span class="w"&gt; &lt;/span&gt;data/ssl/private/bitwarden.key&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2048&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Creating request for Bitwarden certificate, please fill out the FQDN with the nmae that the instance will be located at"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;req&lt;span class="w"&gt; &lt;/span&gt;-config&lt;span class="w"&gt; &lt;/span&gt;data/ssl/bitwarden.ext&lt;span class="w"&gt; &lt;/span&gt;-key&lt;span class="w"&gt; &lt;/span&gt;data/ssl/private/bitwarden.key&lt;span class="w"&gt; &lt;/span&gt;-new&lt;span class="w"&gt; &lt;/span&gt;-sha256&lt;span class="w"&gt; &lt;/span&gt;-out&lt;span class="w"&gt; &lt;/span&gt;data/ssl/csr/bitwarden.csr&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;clear&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Please enter your FQDN for your bitwarden instance: "&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;answer&lt;span class="w"&gt;
&lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/DNS.1 = */c\DNS.1 = &lt;/span&gt;&lt;span class="nv"&gt;$answer&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./data/ssl/bitwarden.ext&lt;span class="w"&gt;
&lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/DNS.2 = */c\DNS.2 = www.&lt;/span&gt;&lt;span class="nv"&gt;$answer&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./data/ssl/bitwarden.ext&lt;span class="w"&gt;
&lt;/span&gt;openssl&lt;span class="w"&gt; &lt;/span&gt;ca&lt;span class="w"&gt; &lt;/span&gt;-config&lt;span class="w"&gt; &lt;/span&gt;data/ssl/bitwarden.ext&lt;span class="w"&gt; &lt;/span&gt;-extensions&lt;span class="w"&gt; &lt;/span&gt;server_cert&lt;span class="w"&gt; &lt;/span&gt;-days&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;375&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-notext&lt;span class="w"&gt; &lt;/span&gt;-md&lt;span class="w"&gt; &lt;/span&gt;sha256&lt;span class="w"&gt; &lt;/span&gt;-in&lt;span class="w"&gt; &lt;/span&gt;data/ssl/csr/bitwarden.csr&lt;span class="w"&gt; &lt;/span&gt;-out&lt;span class="w"&gt; &lt;/span&gt;data/ssl/certs/bitwarden.crt&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your personal CA has been created, please make sure to install myCA.crt as a trusted root CA in all devices you want to connect to this instance"&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;You can edit &lt;strong&gt;data/ssl/bitwarden.ext&lt;/strong&gt; to make cert generating easier. Look at this lines:&lt;/p&gt;
&lt;pre class="code ini literal-block"&gt;
&lt;span class="c1"&gt;# Optionally, specify some defaults.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;countryName_default&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;PL&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;stateOrProvinceName_default&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mazowieckie&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;localityName_default&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Warszawa&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;0.organizationName_default&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;FUBAR&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;organizationalUnitName_default&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;fubarek&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;emailAddress_default&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;bzzzdet@funar.pl&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;and this:&lt;/p&gt;
&lt;pre class="code ini literal-block"&gt;
&lt;span class="k"&gt;[ my_subject_alt_names ]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;DNS.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;bitwarden.fubar&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;DNS.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;www.bitwarden.fubar&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Warning: your certificate will be valid only for above domains. I use Pi-hole local DNS to redirect bitwarden.fubar to my QNap IP address.&lt;/p&gt;
&lt;p&gt;OK, run &lt;strong&gt;create_ssl.sh&lt;/strong&gt; script and follow instructions. At the and you will find whole new structure of folders with files in &lt;strong&gt;ssl&lt;/strong&gt; directory.&lt;/p&gt;
&lt;p&gt;Copy &lt;strong&gt;certs&lt;/strong&gt; and &lt;strong&gt;private&lt;/strong&gt; folders to /share/Container/container-station-data/application/bitwarden/data/ssl.&lt;/p&gt;
&lt;p&gt;Now, start Bitwarden application:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Bitwarden start" src="/uploads/2020/05/bw_qnap02-700x127.png"/&gt;
&lt;/div&gt;
&lt;p&gt;Open web browser and go to the URL like: &lt;a class="reference external" href="https://bitwarden.fubar:5443"&gt;https://bitwarden.fubar:5443&lt;/a&gt;, remeber to change domain to same value as in DNS.1 for ssl.&lt;/p&gt;
&lt;p&gt;You should see Bitwarden login page:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Bitwarden login" src="/uploads/2020/05/bw_qnap03-700x772.png"/&gt;
&lt;/div&gt;
&lt;p&gt;Time to install and use Bitwarden clients on desktops (macOS, Linux, Windows) and mobiles (Android, iOS) but before you'll do it first go back to SSH session on you Qnap and copy "myCA.crt" file on your computer.&lt;/p&gt;
&lt;p&gt;This file is, root CA certificate that will make your Bitwarden clients think that certificate used to connect is valid even it is self signed by you.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;Install CA certificate on every host you use with Bitwarden client:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt; - double click on CRT file and it will open in Keychain Access, add it to System keychain and choose "Always Trust" option,&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt; (Debian/Ubuntu)- &lt;a class="reference external" href="https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate"&gt;https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If your CA is in PEM format convert &lt;tt class="docutils literal"&gt;.pem&lt;/tt&gt; file to a &lt;tt class="docutils literal"&gt;.crt&lt;/tt&gt; file:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="go"&gt;openssl x509 -in myCA.pem -inform PEM -out myCA.crt&lt;/span&gt;
&lt;/pre&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Create a directory for extra CA certificates in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/usr/share/ca-certificates&lt;/span&gt;&lt;/tt&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="go"&gt;sudo mkdir /usr/share/ca-certificates/extra&lt;/span&gt;
&lt;/pre&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;Copy server_rootCA.crt file to this directory:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="go"&gt;sudo cp myCA.crt /usr/share/ca-certificates/extra/.&lt;/span&gt;
&lt;/pre&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;Let Debian/Ubuntu add the &lt;tt class="docutils literal"&gt;.crt&lt;/tt&gt; file's path relative to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/usr/share/ca-certificates&lt;/span&gt;&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/ca-certificates.conf&lt;/span&gt;&lt;/tt&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="go"&gt;sudo dpkg-reconfigure ca-certificates&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;3a. To do this non-interactively, run:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="go"&gt;sudo update-ca-certificates&lt;/span&gt;
&lt;/pre&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt; - don't use it.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;&lt;strong&gt;iOS:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;e-mail to yourself CA certificate (in this case myCA.crt file),&lt;/div&gt;
&lt;div class="line"&gt;go to e-mail app and open this attachement in a message,&lt;/div&gt;
&lt;div class="line"&gt;there will be pop-up informartion saying that youshould go to Settings to install certificate, so go to Settings-&amp;gt;General-&amp;gt;Profiles&lt;/div&gt;
&lt;div class="line"&gt;and finish installation of certificate.&lt;/div&gt;
&lt;div class="line"&gt;After that you have to go back to the main screen of Settings and scroll untli you will see search input at the top. Put "trusted" word in it and thn you'll be presented with "Trusted Certificates" option (which is in Settings-&amp;gt;General-&amp;gt;About).&lt;/div&gt;
&lt;div class="line"&gt;Go there and at bottom there is "Certificate Trust Settings" option, open it and you will see freshly installed certificate. Turn it on making it trusted.&lt;/div&gt;
&lt;div class="line"&gt;Bitwarden app should connect to server flawlessly.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In my setup I use local domain name (bitwarden.fubar) when I connect with OpenVPN client from my mobile so, I had to set up additional options to ovpn config file and to OpenVPN server.&lt;/p&gt;
&lt;p&gt;First: I already have PiHole server on Raspberry Pi (IP: 192.168.0.10) with option translating "bitwarden.fubar" to IP of my Bitwarden host (say its: 192.168.0.13).&lt;/p&gt;
&lt;p&gt;In my ovpn config file add two options:&lt;/p&gt;
&lt;pre class="code cfg literal-block"&gt;
&lt;span class="na"&gt;push "redirect-gateway def1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;push "dhcp-option DNS 192.168.0.10"&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;In my router configuration I use separate DHCP pool for OpenVPN connections. For this pool DNS server to set up to 192.168.0.10). So, when mobile establishes VPN connection all DNS queries are redirected to 192.168.0.10 and it translates "bitwarden.fubar" to 192.168.0.13 which is my Bitwarden instance.&lt;/p&gt;
&lt;p&gt;Little bit complicated but... I liked it.&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;&lt;strong&gt;Firefox&lt;/strong&gt; - go to Preferences -&amp;gt; Privacy &amp;amp; Security -&amp;gt; View Certificates. Click Import, then choose PEM/CRT file, select "Trust this CA to identify websites."&lt;/p&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;&lt;strong&gt;Chrome&lt;/strong&gt; - in macOS it uses Keychain so you don't need to add it again. For Linux check this website: &lt;a class="reference external" href="https://thomas-leister.de/en/how-to-import-ca-root-certificate/"&gt;https://thomas-leister.de/en/how-to-import-ca-root-certificate/&lt;/a&gt;. Quick hint: go to Settings -&amp;gt; Privacy &amp;amp; Security -&amp;gt; Security -&amp;gt; Manage Certificates and Import.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning! Original Bitwarden Desktop client use chromium sandbox so you HAVE TO install CA certificate into Chromium!!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When CA certificate is in right place the last thing is:&lt;/p&gt;
&lt;p&gt;before you connect every Bitwarden client must "know" the right address of Bitwarden server.&lt;/p&gt;
&lt;p&gt;Run client and click gear icon:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Bitwarden client" src="/uploads/2020/06/bit-client-700x504.png"/&gt;
&lt;/div&gt;
&lt;p&gt;then put your server address in 4 fields:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Server URL&lt;/li&gt;
&lt;li&gt;Web vault server URL&lt;/li&gt;
&lt;li&gt;API server URL&lt;/li&gt;
&lt;li&gt;Identity server URL&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class="docutils"/&gt;
&lt;p&gt;Remember to put it in the following form: &lt;a class="reference external" href="https://my.ip.address:myport"&gt;https://my.ip.address:myport&lt;/a&gt;, in case your server has IP 10.0.0.1 and port 5443 it should be: &lt;a class="reference external" href="https://10.0.0.1:5443"&gt;https://10.0.0.1:5443&lt;/a&gt; like in image below. If you use domain name (as me) you should replace IP with domain:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Bitwarden client IP" src="/uploads/2020/06/bit-client2-700x787.png"/&gt;
&lt;/div&gt;
&lt;p&gt;Now, there's time to create account, you can do it pointing browser to the very same URL as used above: &lt;a class="reference external" href="https://10.0.0.1:5443"&gt;https://10.0.0.1:5443&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It's all now ready to use.&lt;/p&gt;
&lt;p&gt;Few steps to consider:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;store database backup somewhere outside Qnap,&lt;/li&gt;
&lt;li&gt;import data from another password manager,&lt;/li&gt;
&lt;li&gt;set up VPN connection to Qnap to synchronize database when you outside.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;UPDATE:&lt;/p&gt;
&lt;p&gt;How to update docker images?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;ALWAYS MAKE BACKUP OF YOUR VAULT!!! Export it in JSON from Bitwarden client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;go to your QNap, run FileStation and zip full content of you application data folder:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external image-reference" href="https://scyzoryk.fubar.pl/wp-content/uploads/2021/02/bitwarden-backup.jpg"&gt;&lt;img alt="bitwarden backup" src="/uploads/2021/02/bitwarden-backup-700x349.jpg" style="width: 700px; height: 349px;"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;stop application in ContainerStation, remove it. Go to Images tab and pull new version of images: bitwardenrs/server, bruceforce/bw_backup and nginx:1.15-alpine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;create application as written at the beginnign of this article, don't run it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;unzip content of previously backup data folder (configuration for nginx, ssl, vault and vault's backup).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;run application.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Automatyczny dom"></category><category term="nas"></category><category term="security"></category></entry><entry><title>Jasiu, chmura to nie backup?</title><link href="https://scyzoryk.fubar.pl/jasiu-chmura-to-nie-backup.html" rel="alternate"></link><published>2020-05-28T20:08:00+02:00</published><updated>2020-05-28T20:08:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-05-28:/jasiu-chmura-to-nie-backup.html</id><summary type="html">&lt;p&gt;Nie no... naprawdę? Przecież mam ten plik w chmurze, a z chmurą mam połączonych chyba ze 20 komputerów. To po co mam backupować? Jak coś się skasuje to mam jeszcze 20 kopii, nie?&lt;/p&gt;
&lt;p&gt;Nie!&lt;/p&gt;
&lt;p&gt;Mam przykład z własnego podwórka. Trzymam bardzo ważny plik w chmurze, bardzo ważny, po prostu BARDZO …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nie no... naprawdę? Przecież mam ten plik w chmurze, a z chmurą mam połączonych chyba ze 20 komputerów. To po co mam backupować? Jak coś się skasuje to mam jeszcze 20 kopii, nie?&lt;/p&gt;
&lt;p&gt;Nie!&lt;/p&gt;
&lt;p&gt;Mam przykład z własnego podwórka. Trzymam bardzo ważny plik w chmurze, bardzo ważny, po prostu BARDZO WAŻNY ale zniknął. Serio, zniknął. Jeszcze nie do końca wiem co się stało, być może nałożyły się tu conajmniej dwa wydarzenia ale fakt jest nagi: pliku nie ma tam gdzie był.&lt;/p&gt;
&lt;p&gt;A był w chmurze z tego względu, że edytowałem go dość często na różnych komputerach.&lt;/p&gt;
&lt;p&gt;Tak się złożyło, że wzraz z koronawirusem wystąpiła przerwa w edycji, więc jeszcze nie mogę powiedzieć kiedy zniknął. Podejrzewam, że ma to związek z grubą awarią głównego komputera. Po odtworzeniu zawartość katalogu w którym plik leżał została zsynchronizowania z chmurą i... zakładałem, że wszystko działa. Wygląda jednak to tak jakby klient chmury nie pociągnął pliku z serwera ale uznał, że było to usunięcie i usunął w chmurze.&lt;/p&gt;
&lt;p&gt;Na szczęście mam backup. Bo chmura, Jasiu, to nie backup.&lt;/p&gt;
&lt;p&gt;p.s. Będę grzebał aby dowiedzieć się co zaszło.&lt;/p&gt;
</content><category term="Administracja"></category><category term="bezpieczeństwo"></category><category term="backup"></category><category term="cloud"></category></entry><entry><title>Licencja z Supermicro</title><link href="https://scyzoryk.fubar.pl/licencja-z-supermicro.html" rel="alternate"></link><published>2020-05-25T16:05:00+02:00</published><updated>2020-05-25T16:05:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-05-25:/licencja-z-supermicro.html</id><summary type="html">&lt;p&gt;Nowy serwer z chińskiej firmy Supermicro w webowej konsoli IPMI (czyli zarządzania) ma opcję aktywacji licencji. Odkrycie to było dla mnie sporym zaskoczeniem, tym bardziej że zakup licencji to koszt 30 dolarów, a umożliwia m. in. uaktualnienie firmware'u.&lt;/p&gt;
&lt;p&gt;Wychodzi na to, że jeśli kupiłem serwer w którym w przyszłości zostanie …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nowy serwer z chińskiej firmy Supermicro w webowej konsoli IPMI (czyli zarządzania) ma opcję aktywacji licencji. Odkrycie to było dla mnie sporym zaskoczeniem, tym bardziej że zakup licencji to koszt 30 dolarów, a umożliwia m. in. uaktualnienie firmware'u.&lt;/p&gt;
&lt;p&gt;Wychodzi na to, że jeśli kupiłem serwer w którym w przyszłości zostanie odkryta wada to muszę wydać kolejne pieniądze, żeby tę wadę (istniejącą nie z mojej winy przecież) usunąć. To jest chore i złe.&lt;/p&gt;
&lt;p&gt;Na szczęście znalazł się człowiek: Peter Kleissner, który o takich praktykach ma podobne do mojego zdanie i postanowił naprawić błąd za pomocą inżynierii wstecznej.&lt;/p&gt;
&lt;p&gt;Okazało się, że kluczem aktywującym jest pierwsze 12 bajtów kodu będącego wynikiem funkcji HMAC z tajnym kluczem: &lt;strong&gt;85 44 E3 B4 7E CA 58 F9 58 30 43 F8&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Czyli wystarczy adres MAC interfejsu sieciowego BMC (IPMI) z płyty głównej naszego serwera użyć w serwisie &lt;a class="reference external" href="https://cryptii.com/pipes/QiZmdA"&gt;cryptii.com&lt;/a&gt;, a pierwsze 6 grup wyniku to nasza licencja.&lt;/p&gt;
&lt;p&gt;Fascynujący i krótki opis &lt;strong&gt;reverse engineeringu&lt;/strong&gt; jest na stronie odkrywcy&lt;a class="reference external" href="https://peterkleissner.com/2018/05/27/reverse-engineering-supermicro-ipmi/"&gt;: Reverse Engineering Supermicro IPMI&lt;/a&gt;.&lt;/p&gt;
</content><category term="Hack"></category><category term="bezpieczeństwo"></category><category term="systemy"></category><category term="komunikacja"></category><category term="programowanie"></category></entry><entry><title>Feghoot czyli AI nie da rady chociaż próbuje</title><link href="https://scyzoryk.fubar.pl/feghoot-czyli-ai-nie-da-rady-chociaz-probuje.html" rel="alternate"></link><published>2020-05-18T07:56:00+02:00</published><updated>2020-05-18T07:56:00+02:00</updated><author><name>paczor</name></author><id>tag:scyzoryk.fubar.pl,2020-05-18:/feghoot-czyli-ai-nie-da-rady-chociaz-probuje.html</id><summary type="html">&lt;p&gt;Wyskoczyła mi dziś w konsoli niezwykła fortunka, zacytuję ją w całości:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
 _________________________________________
/  After the Children of Israel           \
| had wandered for thirty-nine years in   |
| the wilderness, Ferdinand Feghoot       |
| the wilderness, Ferdinand Feghoot       |
| arrived to make sure that they would    |
| finally find and enter the Promised     |
| Land. With him, he brought his …&lt;/pre&gt;</summary><content type="html">&lt;p&gt;Wyskoczyła mi dziś w konsoli niezwykła fortunka, zacytuję ją w całości:&lt;/p&gt;
&lt;pre class="code html literal-block"&gt;
 _________________________________________
/  After the Children of Israel           \
| had wandered for thirty-nine years in   |
| the wilderness, Ferdinand Feghoot       |
| the wilderness, Ferdinand Feghoot       |
| arrived to make sure that they would    |
| finally find and enter the Promised     |
| Land. With him, he brought his favorite |
| robot, faithful old Yewtoo Artoo, to    |
| carry his gear and do assorted camp     |
| chores.                                 |
|                                         |
| The Israelites soon got over their      |
| initial fear of the robot and, as the   |
| months passed, became very fond of him. |
| Patriarchs took to discussing abtruse   |
| theological problems with him, and each |
| evening the children all gathered to    |
| hear the many stories with which he was |
| programmed. Therefore it came as a      |
| great shock to them when, just as their |
| journey was ending, he abruptly wore    |
| out. Even Feghoot couldn't console      |
| them.                                   |
|                                         |
| "It may be true, Ferdinand Feghoot,"    |
| said Moses, "that our friend Yewtoo     |
| Artoo was soulless, but we cannot       |
| believe it. He must be properly         |
| interred. We cannot embalm him as do    |
| the Egyptians. Nor have we wood for a   |
| coffin. But I do have a most splendid   |
| skin from one of Pharoah's own cattle.  |
| We shall bury him in it."               |
|                                         |
| Feghoot agreed. "Yes, let this be his   |
| last rusting place."                    |
|                                         |
| "Rusting?" Moses cried. "Not in this    |
| dreadful dry desert!"                   |
|                                         |
| "Ah!" sighed Ferdinand Feghoot,         |
| shedding a tear, "I fear you do not     |
| realize the full significance of        |
| Pharoah's oxhide!"                      |
|                                         |
| -- Grendel Briarton "Through Time &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;     |
| Space With Ferdinand                    |
|                                         |
\ Feghoot!"                             /
 -----------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
&lt;/pre&gt;
&lt;p&gt;Cytat jest &lt;a class="reference external" href="https://www.wikiwand.com/en/Feghoot"&gt;feghootem&lt;/a&gt; i jedną z wielu opowiastek... hm... SF, napisanych przez Reginalda Brethora alias &lt;a class="reference external" href="https://www.wikiwand.com/en/Reginald_Bretnor"&gt;Grendela Briartona&lt;/a&gt;. Ale ja tu o czym innym.&lt;/p&gt;
&lt;p&gt;Zrozumienie powyższej słownej igraszki wymaga mózgu bynajmniej nie elektronowego. Sztuczna inteligencja, jak na razie, radzi sobie nieźle z kontekstem ale w momencie gdy pojawiają się niuanse traci rezon.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Zastanawia mnie jak działa mój mózg skoro bez ukończenia filologii angielskiej, a wyłącznie z taką sobie, średnią znajomością języka angielskiego od razu wiedział, że chodzi tu o grę słów?&lt;/div&gt;
&lt;div class="line"&gt;Bo AI nie do końca wie ale i tak jest nieźle:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="float wp-block-image size-large is-resized docutils container"&gt;
&lt;img alt="image1" class="wp-image-969" src="/uploads/2020/05/deepl-feghoot.jpg" style="width: 738px; height: 364px;"/&gt;&lt;/div&gt;
&lt;p&gt;"Rusting place" czyli "miejsce spoczynku" ale w powyższej przypowiastce pasuje bardziej "miejsce rdzewunku" tyle, że to już zabawa w Młodą Polskę.&lt;/p&gt;
&lt;p&gt;Na koniec jest "oxhide" czyli dosłownie "wołowa skóra" ale i zlepek "wołowy schowek" bo "ox" to "wół", a "hide" to "chować". Ale przede wszystkim chodzi o "wydech Faraona" czy raczej "oddech", a jeszcze pełniej o oksydację, "oxide", czyli nasze "utlenienie" będące przecież tym samym czym jest "rdzewunek".&lt;/p&gt;
</content><category term="AI"></category><category term="rozrywka"></category><category term="język"></category><category term="AI"></category></entry></feed>