<?xml version='1.0' encoding='windows-1251'?>
<rss version='2.0' xmlns:ya='http://blogs.yandex.ru/yarss/' xmlns:wfw='http://wellformedweb.org/CommentAPI/'>

<channel>
  <title>Леонид Каганов</title>
  <lastBuildDate>Wed, 28 Sep 2022 20:18:28 +0400</lastBuildDate>
  <link>http://lleo.me/blog/</link>
  <description>Леонид Каганов: блог</description>
  <generator>Binoniq 3.0</generator>
  <wfw:commentRss>http://lleo.me/blog/rssc</wfw:commentRss>
  <ya:more>http://lleo.me/blog/rss?skip=10</ya:more>
  <image>
    <url>http://lleo.me/blog/design/userpick.jpg</url>
    <width>120</width>
    <height>155</height>
  </image>


<item>
	<title>2022/09/28 - Делаем лампочку на клавиатуре</title>
	<link>http://lleo.me/blog/2022/09/28</link>
	<comments>http://lleo.me/blog/2022/09/28</comments>
	<pubDate>Wed, 28 Sep 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Wed, 28 Sep 2022 20:18:28 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/09/28</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[Досталась мне беспроводная клавиатура, на которой слева сверху нет лампочек. Ну нет блять лампочек! А у меня мозг привык, что я краем глаза вижу светящиеся лампочки (на нормальных клавиатурах все три) и понимаю, что сейчас включена русская раскладка.

Вообще у меня строгие настройки переключения раскладки: отрубить всё лишнее говно в Убунте, вывести клавиатурные задержки в привычный мне высокоскоростной режим и установить кнопку смены раскладки CAPS. Сама раскладка - вариант winkews, ну и конечно зажигание всех трех светодиодов (caps,scroll,num) при русской раскладке. Это у меня исторически делается так:

<p>=============== cut ===============<br>sudo pkill -f -9 lxqt-globalkeysd
sudo killall /usr/bin/lxqt-globalkeysd

/usr/bin/xset r rate 200 80
/usr/bin/setxkbmap -option terminate:ctrl_alt_bksp
/usr/bin/setxkbmap -variant ,winkeys -layout us,ru
/usr/bin/setxkbmap -option grp:caps_toggle,grp_led:caps,grp_led:scroll,grp_led:num,grp:switch<br>=============== /cut ===============<p>

Но светодиодов у нас больше нет. Что же делать?! Пришлось доработать клавиатуру, поставив допонительную беспроводную лампочку с питанием от USB.

Для начала по совету Кирилла мы берем утилиту, которая позволяет читать состояние раскладки:
<a href='https://github.com/nonpop/xkblayout-state'>https://github.com/nonpop/xkblayout-state</a> Она конечно сразу не соберется, поэтому надо установить библиотеку, тогда соберется:

<p>=============== cut ===============<br><div align=left><tt><pre><code style=&quot;color: #000000&quot;><span style='color: #0000BB'>&lt;?php
XKeyboard</span><span style='color: #007700'>.</span><span style='color: #0000BB'>h</span><span style='color: #007700'>:</span><span style='color: #0000BB'>20</span><span style='color: #007700'>:</span><span style='color: #0000BB'>10</span><span style='color: #007700'>: </span><span style='color: #0000BB'>fatal error</span><span style='color: #007700'>: </span><span style='color: #0000BB'>X11</span><span style='color: #007700'>/</span><span style='color: #0000BB'>Xlib</span><span style='color: #007700'>.</span><span style='color: #0000BB'>h</span><span style='color: #007700'>: </span><span style='color: #0000BB'>No such file </span><span style='color: #007700'>or </span><span style='color: #0000BB'>directory
   20 </span><span style='color: #007700'>| </span><span style='color: #FF8000'>#include &lt;X11/Xlib.h&gt;
      </span><span style='color: #007700'>|          ^~~~~~~~~~~~
</span><span style='color: #0000BB'>compilation terminated</span><span style='color: #007700'>.

&gt; </span><span style='color: #0000BB'>sudo apt</span><span style='color: #007700'>-</span><span style='color: #0000BB'>get install libx11</span><span style='color: #007700'>-</span><span style='color: #0000BB'>dev
?&gt;</span></code></pre></tt></div><br>=============== /cut ===============<p>

Итак, утилита готова и считывает состояние раскладки:

<p>=============== cut ===============<br>xkblayout-state print &quot;%s&quot;<br>=============== /cut ===============<p>

Теперь нужна управляемая лампочка. Проще всего взять чип ESP12 и накатить на него мой фреймворк для поливальных станций и прочих управляемых девайсов. Нужна прошивка нового поколения MERA. Как она работает с поливальными станциями, я пока не тестировал, но в ней есть передача парольного хэша в командной строке, что облегчает дистанционное исполнение скриптов из командной строки компьютера (раньше было можно давать авторизацию только в куках). Берем последнюю на сегодняшний день версию: <a href='https://lleo.me/ESP8266/firmware.new/firmware12_113.08.bin'>https://lleo.me/ESP8266/firmware.new/firmware12_113.08.bin</a> Как описано в языке <a href='https://lleo.me/ESP8266/cfaq#autorization'>cfaq</a> в самом конце, мы можем делать парольные обращения. По шнуру USB чип не управляется - в ESP12 почему-то не работают входящие сигналы от Serial, так что управлять будем по WIFI.

Пишем демона, который будет следить за состоянием раскладки и зажигать лампочку:

<p>=============== cut ===============<br><div align=left><tt><pre><code style=&quot;color: #000000&quot;><span style='color: #0000BB'>&lt;?php
</span><span style='color: #FF8000'>#!/bin/sh

</span><span style='color: #0000BB'>IP</span><span style='color: #007700'>=</span><span style='color: #DD0000'>&quot;10.20.0.77&quot;

</span><span style='color: #FF8000'># change password

</span><span style='color: #0000BB'>hash</span><span style='color: #007700'>=`</span><span style='color: #DD0000'>wget -q -O - &quot;http://</span><span style='color: #007700'>${</span><span style='color: #0000BB'>IP</span><span style='color: #007700'>}</span><span style='color: #DD0000'>/FM?a=login&amp;password=gluki&quot;</span><span style='color: #007700'>`
echo </span><span style='color: #DD0000'>&quot;Hash=</span><span style='color: #0000BB'>$hash</span><span style='color: #DD0000'>&quot;
</span><span style='color: #0000BB'>wget </span><span style='color: #007700'>-</span><span style='color: #0000BB'>q </span><span style='color: #007700'>-</span><span style='color: #0000BB'>O </span><span style='color: #007700'>- </span><span style='color: #DD0000'>&quot;http://</span><span style='color: #007700'>${</span><span style='color: #0000BB'>IP</span><span style='color: #007700'>}</span><span style='color: #DD0000'>/MOTO?hash=</span><span style='color: #007700'>${</span><span style='color: #0000BB'>hash</span><span style='color: #007700'>}</span><span style='color: #DD0000'>&amp;set MAINLOOP = |pinmode 2 OUTPUT|pin 2 1&quot;

</span><span style='color: #0000BB'>KEY</span><span style='color: #007700'>=</span><span style='color: #DD0000'>&quot;Wru&quot;

</span><span style='color: #007700'>while [ </span><span style='color: #0000BB'>1 </span><span style='color: #007700'>]
do
    </span><span style='color: #0000BB'>K</span><span style='color: #007700'>=`</span><span style='color: #DD0000'>/home/lleo/wifi/xkblayout-state print &quot;%s&quot;</span><span style='color: #007700'>`
    if [ </span><span style='color: #DD0000'>&quot;K&quot;</span><span style='color: #007700'>${</span><span style='color: #0000BB'>K</span><span style='color: #007700'>} != </span><span style='color: #DD0000'>&quot;K&quot;</span><span style='color: #007700'>${</span><span style='color: #0000BB'>KEY</span><span style='color: #007700'>} ] ; </span><span style='color: #0000BB'>then
        </span><span style='color: #007700'>echo </span><span style='color: #DD0000'>&quot;New Layout = </span><span style='color: #007700'>${</span><span style='color: #0000BB'>K</span><span style='color: #007700'>}</span><span style='color: #DD0000'>&quot;
        </span><span style='color: #0000BB'>KEY</span><span style='color: #007700'>=${</span><span style='color: #0000BB'>K</span><span style='color: #007700'>}
        if [ </span><span style='color: #DD0000'>&quot;K&quot;</span><span style='color: #007700'>${</span><span style='color: #0000BB'>K</span><span style='color: #007700'>} = </span><span style='color: #DD0000'>&quot;Kus&quot; </span><span style='color: #007700'>] ; </span><span style='color: #0000BB'>then
            wget </span><span style='color: #007700'>-</span><span style='color: #0000BB'>q </span><span style='color: #007700'>-</span><span style='color: #0000BB'>O </span><span style='color: #007700'>- </span><span style='color: #DD0000'>&quot;http://</span><span style='color: #007700'>${</span><span style='color: #0000BB'>IP</span><span style='color: #007700'>}</span><span style='color: #DD0000'>/MOTO?hash=</span><span style='color: #007700'>${</span><span style='color: #0000BB'>hash</span><span style='color: #007700'>}</span><span style='color: #DD0000'>&amp;pin 2 1&quot;
        </span><span style='color: #007700'>else
            </span><span style='color: #0000BB'>wget </span><span style='color: #007700'>-</span><span style='color: #0000BB'>q </span><span style='color: #007700'>-</span><span style='color: #0000BB'>O </span><span style='color: #007700'>- </span><span style='color: #DD0000'>&quot;http://</span><span style='color: #007700'>${</span><span style='color: #0000BB'>IP</span><span style='color: #007700'>}</span><span style='color: #DD0000'>/MOTO?hash=</span><span style='color: #007700'>${</span><span style='color: #0000BB'>hash</span><span style='color: #007700'>}</span><span style='color: #DD0000'>&amp;pin 2 0&quot;
        </span><span style='color: #0000BB'>fi
    fi
    sleep 0.1
done
?&gt;</span></code></pre></tt></div><br>=============== /cut ===============<p>

Приматывем девайс изолентой в нужный угол клавиатуры и наслаждаемся:

<center><div style='display: inline-block; max-width: 90% !important;EEEwidth:853px;border: 1px solid #ccc; box-shadow: 0px 15px 15px 15px rgba(0,0,0,0.6); border-radius: 7px 7px 7px 7px; padding: 15px 15px 15px 15px;margin-bottom:35px;'><iframe width='853' height='480' src='https://www.youtube.com/embed/e9FRnHOLnFw?rel=0&showinfo=0' frameborder='0' allowfullscreen>https://www.youtube.com/embed/e9FRnHOLnFw?rel=0&showinfo=0</iframe></div></center>]]></description>
</item>

<item>
	<title>2022/09/08 - Firefox ёбнулся окончательно</title>
	<link>http://lleo.me/blog/2022/09/08</link>
	<comments>http://lleo.me/blog/2022/09/08</comments>
	<pubDate>Thu, 08 Sep 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Thu, 08 Sep 2022 23:33:24 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/09/08</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[
Firefox после переустановки окончательно ёбнулся — теперь он «для безопасности» не открывает на просмотр файлы с локального диска, только из интернета:

<p>=============== cut ===============<br>Firefox 57: К сожалению, локальные файлы больше не поддерживаются — это ограничение WebExtension API.<br>=============== /cut ===============<p>

ЭТО БЛЯТЬ ЧТО?!! Вы там совсем объектно ебанулись, понабрали эффективных мальчиков после вузиков?! Это что мне теперь, сносить нахуй Firefox и переходить на Chrome только потому, что иногда я желаю открыть file:///tmp/1.htm и поработать с дизайном? Или даже хуй с ним, с дизайном, а если мне с работы присылают в почту файл Documentation.html чтобы я с ним поработал? А если у меня документация Readme!!!.htm лежит вместе с драйверами на флешке, которую производитель выслал в комплекте с устройством?!

Что особенно привет, так это наличие в настройках Firefox about:config специальной секретной опции для такого случая security.fileuri.strict_origin_policy, которую можно перевести в false, но... это теперь тоже ни на что не повляет. Открывайте, хомячки, все файлы только в интернете. Вот там — безопасненько. Мы так решили.

<b>UPD:</b> Похоже, всё не так безнадежно, а всё говно происходит от установки Firefox по умолчанию в комплекте Lubuntu — там он через какой-то непонятный snapd. Было сделано следующее:


1. Скачан firefox с сайта mozilla.org

2. Убрано всё несусветное говно:
sudo apt purge firefox
sudo apt purge snapd

3. Поставлен заново Firefox из скачанного пакета и просинхронизированы настройки.

Теперь работает. Видимо, с ума сошел snap — я так понимаю, это какой-то защитный контейнер. Слишком защищал.]]></description>
</item>

<item>
	<title>2022/09/07 - После переустановки Linux</title>
	<link>http://lleo.me/blog/2022/09/07</link>
	<comments>http://lleo.me/blog/2022/09/07</comments>
	<pubDate>Wed, 07 Sep 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Thu, 08 Sep 2022 21:17:09 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/09/07</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[Установил Линукс на новую машинку, обживаю постепенно. Всё старое переехало на Lubuntu 22.04, но осталась куча глюков, которые просто бесят.

Вот например, мой любимый почтовый клиент sylpheed вдруг стал в редакторе все слова в русских письмах подчеркивать красным. Если в настройках редактора в разделе орфографии ему указать язык «ru_RU» вместо «en», то все нормально, но до следующего письма только. Выяснилось, что он неправильно сохраняет себе настройки в конфиг ~/.sylpheed-2.0/sylpheedrc Если там вместо «spell_lang=<b>ru</b>» вручную вписать «spell_lang=<b>ru_RU</b>» — проблема исчезнет.

Но куда противнее, что при каждой перезагрузке при каждом соединении с мышью или клавиатурой включается какой-то внутренний переключатель раскладки, который начинает дублировать мою. И пока не влезеть в «Настройки клавиатуры и мыши» и в разделе «Раскладка клавиатуры» чего-нибудь не испортишь (например, уберешь русский язык или в качестве кнопки переключения раскладки выберешь «Нет»), все будет глючить. Но затем все повторится. <s>Как это починить или как вообще отключить это чертово дополнительное переключение раскладки — я пока не понял.</s> Кажется, нашел. Надо нужные настройки вписать сюда: <b>/etc/X11/xorg.conf.d/00-keyboard.conf</b>, оно отсюда их всякий раз берет заново. У меня сейчас так:

<p>=============== cut ===============<br><div align=left><tt><pre><code style=&quot;color: #000000&quot;><span style='color: #0000BB'>&lt;?php
Section &quot;InputClass&quot;
        Identifier &quot;system</span><span style='color: #007700'>-</span><span style='color: #0000BB'>keyboard&quot;
        MatchIsKeyboard &quot;on&quot;
        Option &quot;XkbLayout&quot; &quot;us</span><span style='color: #007700'>,</span><span style='color: #0000BB'>ru&quot;
        Option &quot;XkbOptions&quot;
EndSection
?&gt;</span></code></pre></tt></div><br>=============== /cut ===============<p>

Но все равно не могу отделаться от ощущения, что клавиатура чуть-чуть подтормаживает. Уже и задержки вывел на максимум, а все равно, такое чувство, будтио висит какая-то прослойка, писанная на языке очень высокого уровня, и пару милисекунд анализирует каждую нажатую кнопку. Вот бы это говно отключить...

<p>=============== cut ===============<br><div align=left><tt><pre><code style=&quot;color: #000000&quot;><span style='color: #0000BB'>&lt;?php
sudo pkill </span><span style='color: #007700'>-</span><span style='color: #0000BB'>f </span><span style='color: #007700'>-</span><span style='color: #0000BB'>9 lxqt</span><span style='color: #007700'>-</span><span style='color: #0000BB'>globalkeysd
sudo killall </span><span style='color: #007700'>/</span><span style='color: #0000BB'>usr</span><span style='color: #007700'>/</span><span style='color: #0000BB'>bin</span><span style='color: #007700'>/</span><span style='color: #0000BB'>lxqt</span><span style='color: #007700'>-</span><span style='color: #0000BB'>globalkeysd

</span><span style='color: #007700'>/</span><span style='color: #0000BB'>usr</span><span style='color: #007700'>/</span><span style='color: #0000BB'>bin</span><span style='color: #007700'>/</span><span style='color: #0000BB'>xset r rate 200 80
</span><span style='color: #007700'>/</span><span style='color: #0000BB'>usr</span><span style='color: #007700'>/</span><span style='color: #0000BB'>bin</span><span style='color: #007700'>/</span><span style='color: #0000BB'>setxkbmap </span><span style='color: #007700'>-</span><span style='color: #0000BB'>option terminate</span><span style='color: #007700'>:</span><span style='color: #0000BB'>ctrl_alt_bksp
</span><span style='color: #007700'>/</span><span style='color: #0000BB'>usr</span><span style='color: #007700'>/</span><span style='color: #0000BB'>bin</span><span style='color: #007700'>/</span><span style='color: #0000BB'>setxkbmap </span><span style='color: #007700'>-</span><span style='color: #0000BB'>variant </span><span style='color: #007700'>,</span><span style='color: #0000BB'>winkeys </span><span style='color: #007700'>-</span><span style='color: #0000BB'>layout us</span><span style='color: #007700'>,</span><span style='color: #0000BB'>ru
</span><span style='color: #007700'>/</span><span style='color: #0000BB'>usr</span><span style='color: #007700'>/</span><span style='color: #0000BB'>bin</span><span style='color: #007700'>/</span><span style='color: #0000BB'>setxkbmap </span><span style='color: #007700'>-</span><span style='color: #0000BB'>option grp</span><span style='color: #007700'>:</span><span style='color: #0000BB'>caps_toggle</span><span style='color: #007700'>,</span><span style='color: #0000BB'>grp_led</span><span style='color: #007700'>:</span><span style='color: #0000BB'>caps</span><span style='color: #007700'>,</span><span style='color: #0000BB'>grp_led</span><span style='color: #007700'>:</span><span style='color: #0000BB'>scroll</span><span style='color: #007700'>,</span><span style='color: #0000BB'>grp_led</span><span style='color: #007700'>:</span><span style='color: #0000BB'>num</span><span style='color: #007700'>,</span><span style='color: #0000BB'>grp</span><span style='color: #007700'>:switch
</span><span style='color: #0000BB'>?&gt;</span></code></pre></tt></div><br>=============== /cut ===============<p>]]></description>
</item>

<item>
	<title>2022/09/05 - ESP32-S3 уходит в вечную перезагрузку</title>
	<link>http://lleo.me/blog/2022/09/05</link>
	<comments>http://lleo.me/blog/2022/09/05</comments>
	<pubDate>Mon, 05 Sep 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Mon, 05 Sep 2022 19:56:08 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/09/05</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[Чип ESP32 версия S2 и S3 (с обычным все норм) не прошивается из новой Arduino под Linux — уходит при старте в вечную перезагрузку. При том что под Windows все нормально. Благодаря Дмитрию и подробным изысканиям удалось выяснить, что причина — утилита esptool.py новой версии, которую использует Arduino.

Надо сказать, что пакет Arduino написан так чудесато, что там этих esptool.py в разных папках встречается бесчисленное множество. И если в одном месте версию 3.3.0 заменить на старую 2.0.4, всё начинает работать:

<p>=============== cut ===============<br><div align=left><tt><pre><code style=&quot;color: #000000&quot;><span style='color: #0000BB'>&lt;?php
cd </span><span style='color: #007700'>~/.</span><span style='color: #0000BB'>arduino15</span><span style='color: #007700'>/</span><span style='color: #0000BB'>packages</span><span style='color: #007700'>/</span><span style='color: #0000BB'>esp32</span><span style='color: #007700'>/</span><span style='color: #0000BB'>tools</span><span style='color: #007700'>/</span><span style='color: #0000BB'>esptool_py</span><span style='color: #007700'>/</span><span style='color: #0000BB'>3.3.0</span><span style='color: #007700'>/
</span><span style='color: #0000BB'>mv </span><span style='color: #007700'>./</span><span style='color: #0000BB'>esptool</span><span style='color: #007700'>.</span><span style='color: #0000BB'>py </span><span style='color: #007700'>./</span><span style='color: #0000BB'>esptool</span><span style='color: #007700'>.</span><span style='color: #0000BB'>py</span><span style='color: #007700'>.</span><span style='color: #0000BB'>fuck
ln </span><span style='color: #007700'>-</span><span style='color: #0000BB'>s </span><span style='color: #007700'>~/.</span><span style='color: #0000BB'>arduino15</span><span style='color: #007700'>/</span><span style='color: #0000BB'>packages</span><span style='color: #007700'>/</span><span style='color: #0000BB'>esp32</span><span style='color: #007700'>/</span><span style='color: #0000BB'>hardware</span><span style='color: #007700'>/</span><span style='color: #0000BB'>esp32</span><span style='color: #007700'>/</span><span style='color: #0000BB'>2.0.4</span><span style='color: #007700'>/</span><span style='color: #0000BB'>tools</span><span style='color: #007700'>/</span><span style='color: #0000BB'>esptool</span><span style='color: #007700'>.</span><span style='color: #0000BB'>py </span><span style='color: #007700'>./</span><span style='color: #0000BB'>esptool</span><span style='color: #007700'>.</span><span style='color: #0000BB'>py
?&gt;</span></code></pre></tt></div><br>=============== /cut ===============<p>]]></description>
</item>

<item>
	<title>2022/08/10 - Пиктограммы на сайтах</title>
	<link>http://lleo.me/blog/2022/08/10</link>
	<comments>http://lleo.me/blog/2022/08/10</comments>
	<pubDate>Wed, 10 Aug 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Wed, 10 Aug 2022 13:00:37 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/08/10</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[<center><img class='foto' src='http://lleo.me/blog/2022/08/10/IMG_20220809_224119.jpg' border='0'></center>

Хорошо, когда ты типа дизайнер и рисуешь сам пиктограммы для сайта — home.jpg, contacts.jpg, nextpage.png...

Хуже, когда ты понимаешь, что за каждой пиктограммой браузеры пользователей будут бегать на сайт. Тогда ты пишешь скрипт, который собирает все твои картинки в один длинный PNG, а верстаются из него одиночные картинки при помощи автоматически созданного CSS. А если какая-то картинка длинная, то ее даже можно развернуть, чтобы не разбивать пустой шириной единую шеренгу, а при извлечении поворачивать в CSS rotate. Как <a href='http://lleo.me/ESP8266/MERA/ico.png'>тут</a>.

Или вот тоже был случай: год назад один добрый читатель по своей инициативе нарисовал мне хорошие красивые пиктограммы. Но воспользоваться ими в движке у меня не вышло. Проблема в том, что общий пакет его svg-изображений весил полмега — больше, чем весь мой движок. Как эти пиктограммы прогрузятся с верхней полки поезда на обрывках интернета? А ведь это иногда единственное свободное время чтобы писать заметки. Как сейчас, например.

Но это ещё полбеды. А если у тебя веб-сайт внутри микрочипа? И каждое лишнее обращение за файлом — картинкой, скриптом, css — для него болезненно?

Вчера я нашел красивый выход: встроенные пиктограммы Unicode. Сюрприз: да, они уже давно работают буквально в любом браузере. Занимает каждый значок несколько байт: &quot;#129518; А на экране выглядит богато, особенно если поиграть размерами и тенями (кто видел другие убогие странички внутри микрочипов — там вообще 90-е царят обычно). Хотя в каждом браузере иконка выглядит по-разному. Но выглядит же! Кажется, мне удалось найти наборы иконок, которые есть во всех браузерах. Вы же их видите? Все, да?

<center><table><tr><td align=left><p>&#129518; Info
&#128244; Reboot
&#128246; WiFi
&#128693; Update
&#127981; GPIO
&#127748; Monitor
&#128190; Files
&#128275; Open
&#128272; Key
&#128274; Close
&#128273; Pin</td></tr></table></center>]]></description>
</item>

<item>
	<title>2022/08/09 - Webp VX Jpeg</title>
	<link>http://lleo.me/blog/2022/08/09</link>
	<comments>http://lleo.me/blog/2022/08/09</comments>
	<pubDate>Tue, 09 Aug 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Mon, 08 Aug 2022 04:36:47 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/08/09</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[<center><img class='foto' src='http://lleo.me/blog/2022/08/09/IMG_20220808_030105.jpg' border='0'></center>

Скажу честно, несколько лет формат webp вызвал у меня только недоумение. Тем более, что смотреть его было нечем — мой любимый аысокоскоростной посмотрщик изображений qiv его не брал.

Но на днях я вдруг понял, что webp:
a) давно поддерживается всеми без исключения браузерами
б) жмёт картинки скачать ли не вдвое компактннй, чем jpeg
в) поддерживает прозрачность как PNG

Ну а что webp не смотрит в Линуксе один конкретный qiv, так на то, я нашел, есть pqiv. Его можно прописать именно на webp и забыть о проблеме.

Для эксперимента с картинками я пережал пару сотен небольших логотипов 400х400 в webp, что сверстаны у меня на странице тут: <a href='http://lleo.design.ru'>http://lleo.design.ru</a>

Использовал консольное преобразование (Linux):

<p>=============== cut ===============<br>convert IN.jpg -transparent white -fuzz 5% OUT.webp<br>=============== /cut ===============<p>

Результаты изумили: качество сохранилось, прозрачность добавилась, а общий размер пачки логотипов уменьшился в семь (семь!) раз. На крупных jpg разница будет, конечно, меньше, но на куче мелких — впечатляет.

Теперь думаю перевести и весь движок на webp, чтобы вообще все картинки он пережимал в webp — и фотки, что я подгружаю в заметки, и фотки, что заливают в комментарии читатели, и юзерпики, вообще всё. Ну потому что дикая экономия места и ресурсов, а Канада не железная всё это хранить.

Как вам такая идея?
]]></description>
</item>

<item>
	<title>2022/08/08 - Android клиент ssh</title>
	<link>http://lleo.me/blog/2022/08/08</link>
	<comments>http://lleo.me/blog/2022/08/08</comments>
	<pubDate>Mon, 08 Aug 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Mon, 08 Aug 2022 05:15:29 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/08/08</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[<center>
<img class='foto' src='http://lleo.me/blog/2022/08/08/Screenshot_2022-08-08-01-38-35-841_com.sonelli.juicessh.jpg' border='0'>
</center>

Какое счастье! Нашел для Ондроеда нормальный SSH со всеми стрелками, хоть mc запускай. Называется Juice ssh,  а то я все эти годы сидел на тупом VX ConnectBot, который мне сто лет назад посоветовал Арканоид...]]></description>
</item>

<item>
	<title>2022/02/13 - Как скачать mp3 с ВКонтактика</title>
	<link>http://lleo.me/blog/2022/02/13</link>
	<comments>http://lleo.me/blog/2022/02/13</comments>
	<pubDate>Sun, 13 Feb 2022 00:00:00 +0400</pubDate>
	<lastBuildDate>Sun, 13 Feb 2022 18:36:08 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2022/02/13</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[ВК стал шифровать часть (некоторые части) ts в потоке. Просто так скачать и слить ts в один нельзя — будут битые куски. Раскодировать их через openssl наверно можно, но там непонятности с IV (он не указан, в этом случае формат m3u8 предлагает брать «attribute value or the Media Sequence Number as the IV»). Формат кодировки интресен, но лень изучать: в любом случае, это умеет делать сам ffmpeg. Найденные в сети инструкции выдают ошибку, правильная конструкция с ключом -protocol_whitelist:

<p>=============== cut ===============<br>ffmpeg -protocol_whitelist file,tls,tcp,https,http,crypto -allowed_extensions ALL -i file.m3u8 -c copy file.mp3<br>=============== /cut ===============<p>

Но для этого надо сперва скачать и file.m3u8, и все указанные в нем .ts себе. Если же указать сетевой mp3u сразу:

-i 'https://psv4.vkuseraudio.net/s/v1/a2/yA72oYyi_ZV8R3GDFwaEZsWxIfgNsZp9uMiYcRALgTzb6v_NYTVC1nQvnBriZtzz-W9blM50ZUpj7twinYuSfClUL_o9M-tr81_XzKG1yky7es3lTZIO1qpCwtPB
aBv4ERmncvCJM4R2zvv7H5s0PtHWhd-aQwOEAg/index.m3u8'

То исходный файл окажется битым — не расшифруются те выборочные ts, что были шифрованы.]]></description>
</item>

<item>
	<title>2017/03/09 - Шаблон комментариев</title>
	<link>http://lleo.me/blog/2017/03/09</link>
	<comments>http://lleo.me/blog/2017/03/09</comments>
	<pubDate>Thu, 09 Mar 2017 00:00:00 +0400</pubDate>
	<lastBuildDate>Thu, 09 Mar 2017 00:51:44 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2017/03/09</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[Я сейчас активно обновляю движок.

Про комментарии могу рассказать следующее.

Простыня комментариев — это лента из блоков:

&lt;div id=1001 class=c0 style=&#39;margin-left: XXX px&#39;&gt;сюда ставится коммент по шаблону&lt;/div&gt;
&lt;div id=1002 class=c0 style=&#39;margin-left: XXX px&#39;&gt;сюда ставится коммент по шаблону&lt;/div&gt;
&lt;div id=1003 class=c1 style=&#39;margin-left: XXX px&#39;&gt;сюда ставится коммент по шаблону&lt;/div&gt;
&lt;div id=1004 class=c0 style=&#39;margin-left: XXX px&#39;&gt;сюда ставится коммент по шаблону&lt;/div&gt;

Сам шаблон комментария по умолчанию (они, кстати, могут быть разные и указываться в дизайне страницы) лежит здесь для базового дизайна страниц: http://lleo.me/dnevnik/install?template/comm/comment_tmpl.htm|

В шаблоне встречаются переменные типа &#123;имя&#125; (или &#123;#имя&#125; — то же самое, но с очисткой нежелательных html-символов).
Эти переменные шаблону передает сервер, в них самая разная информация о комментарии. Давайте я их перечислю:

&#123;#id&#125; — уникальный номер комментария в базе (у меня сейчас чуть ли не шестизначный)
&#123;paren&#125; — некая готовая html-конструкция (как правило, иконка), которая по клику покажет раскроет родительский комментарий, если комментарий не первого уровня. Движок ее рисует сам в другом месте (что наверно мое упущение).

&#123;#BRO&#125; — сокращенное имя браузера автора комментария
&#123;#BROlong&#125; — полное имя браузера автора комментария

&#123;#country&#125; — двухбуквенный код страны
&#123;#countryname&#125; — полное название страны
&lt;i class=&#34;flag-&#123;#country&#125;&#34;&gt;&lt;/i&gt; — на месте этой конструкции появится иконка — флажок страны

&#123;#city&#125; — сокращенное название города, если он определился по IP
&#123;#citylong&#125; — полное название города, если он определился по IP

&#123;date&#125; — дата комментария
&#123;datetime&#125; — не помню, тоже какая-то дата, наверно полная, с минутами

&#123;rul&#125; — 1 или 0 — пометка для самых важных комментариев (в реальной жизни пока не часто используется, но в принципе идея была для постов (напр. «Как мне настроить роутер ASUS RT16N?) выводить на первый уровень только самые ценные комментарии с важными инструкциями.

&#123;#golos_plu&#125; число плюсиков, которые получил комментарий
&#123;#golos_min&#125; число минусиков, которые получил комментарий

&#123;ifpodzamok&#125; переменная-флаг: 1 — комментарий просматривает тот, кто имеет подзамочный доступ (им показывается чуть больше информации), 0 — обычный посетитель

&#123;admin&#125;  переменная-флаг: 1 — комментарий просматривает админ сайта (ему показывается больше информации), 0 — обычный посетитель или подзамочный

&#123;name&#125; — имя автора комментария

&#123;#img&#125; — линк на иконку автора комментария (если она есть)

&#123;text&#125; — сам текст комментария (конструкция с очисткой &#123;#text&#125; не применяется, так как при обработке комментария движок уже мог вставить HTML-конструкции: картинки, ссылки, аудиоплеер)

&#123;newuser&#125; переменная-флаг: 1 — автор комментария под небольшим подозрением на спам, 0 — обычный автор

&#123;scr&#125; переменная-флаг: 1 — комментарий скрыт ото всех, кроме админа и подзамков, 0 — открыт

Теперь пару слов про систему условных ветвлений (о да, господи, наросло в движке и такое). Формат покажу на примере фразы:

Ага, я вижу, что вы &#123;?country:
Россия:кацап
Украина:хохол
Израиль:жид
США:пиндос
:не определились
*:из какой-то малопопулярной страны
?&#125;, с чем вас и поздравляю!

начало и конец тэга &#123;? ... ?&#125;, варианты перечислены по строкам и разделены двоеточием. В примере движок выдаст разный текст в зависимости от значений переменной country. Для США напишет «Ага, я вижу, что вы пиндос, с чем вас и поздравляю!», звездочка * ставится в конце списка и означает «любое». В качестве текста вместо «пиндос» может бюыть любая конструкция, включая HTML-тэги, лишь бы там не было перевода строки или, упаси боже, еще одного такого же ветвления. Впрочем, есть один вариант.

Второй способ записи той же конструкции — заменить все переводы строки на знак | Вот так:

Ага, я вижу, что вы &#123;?country:|Россия:кацап|Украина:хохол|Израиль:жид|США:пиндос|:не определились|*:из какой-то малопопулярной страны|?&#125;, с чем вас и поздравляю!

И вот эту форму записи (в виде одной строки) можно вставлять в качестве строк в форму записи первого типа.
То есть, условное ветвление все-таки допускает вложенность, но всего одну на каждый из вариантов.

Осталось сказать, что в движке есть ряд аякс-обращений к движку (действий), обычно они делаются через JS-функцию majax: onclick=«majax(...)&#34;

Для сокращения размера текста некоторые из этих функций вынесены отдельно и находятся в главном JS-файле фреймворка main.js: http://lleo.me/dnevnik/install?js/main.js|

Поэтому если в темплейте комментария встречается что-то типа «kl(this)&#34;, то это означает, что такой короткой записью вызывается небольшая стандартная функция, которая по this пойдет искать вверх до главного DIV, чтобы найти id комментария, после чего даст некий запрос на сервер. Например, kpl(this) поставит комментарию плюсик, kmi(this) — минус. Все такие запросы обрабатывает сервер, после чего обычно комментарий (главный DIV id=XXXXX) заменяется новым содержимым, которое высылает сервер. Если посетитель поставил комментарию плюсик — ему заменится весь комментарий, и там уже будет виден его плюсик.

В новой версии движка полезные иконки сделаны одним файлом и сверстаны в css. Например, иконка почтового конвертика: &lt;i class=&#39;e_kmail&#39;&gt;&lt;/i&gt; Если на него кликнуть, движок откроет окошко для написания комментария в личку: &lt;i class=&#39;e_kmail&#39; title=&#39;написать&#39; onclick=&#34;majax(&#39;mailbox.php&#39;,&#123;a:&#39;newform&#39;,unic:&#123;unic&#125;&#125;)&#34;&gt;&lt;/i&gt; Это более новое наслоение, которое я не успел убрать в отдельную функцию.

Для разных данных в одном комментарии есть несколько классов, например: &lt;div class=ctxt&gt;&#123;text&#125;&lt;/div&gt; Эти классы заданы в главном sys.css: http://lleo.me/dnevnik/install?css/sys.css| Но по-хорошему им там делать нечего, их можно менять как угодно (короткие имена им были даны для экономии трафика, ведь бывают простыни и по 500 комментариев).

/* комментарии */
.opc, .cnam, .rul1,.rul0 &#123;cursor: pointer&#125;
.rul1,.rul0,.cplu,.cmin,.kmail &#123;float:left&#125;
.c0, .c1, .c2, .c3, .c4, .c5, .c6 &#123; font: 80% sans-serif, Helvetica, Arial, Verdana; width: 60% !important; border: 1px solid #bbb;
/* IE */ filter: progid:DXImageTransform.Microsoft.shadow(direction=120, color=#888888, strength=10);
box-shadow: #888 5px 5px 5px; border-radius: 0.8em 0.8em 0.8em 0.8em; overflow: auto; padding: 0.4em 0.4em 0.4em 0.4em; margin: 0.4em 0 0 0.4em; &#125;
.c0 &#123; background-color: #AAFAFA; &#125;
.c1, .opc &#123; background-color: #F1F1F1; &#125;
.c2 &#123; background-color: #FFFBDF; border: 1px solid red; &#125;
.c3 &#123; background-color: #FFEBCD; border: 1px solid red; &#125;
.c4 &#123; background-color: #eAf; border: 1px solid red; &#125;
.c5 &#123; background-color: #Aef; border: 1px solid red; &#125;
.c6 &#123; background-color: #Aef; border: 1px solid red; &#125;
.ctxt &#123; padding: 5pt; text-align: justify; &#125;
.cwho,.ctim,.cbro &#123; font-size: 8pt; display:inline; margin: 0 10pt 0 10px; top: 0px; position: relative; float: right; &#125;
.ctim,.cbro,.cwho,.kr,.rul0,.rul1,.kmail,.cnam,.cplu,.cmin &#123; display:inline; &#125;
.cnam &#123; font-size: 12pt; font-weight: bold; &#125;
.cplu,.cmin &#123; font-size:10pt; &#125;
.cplu &#123;color:#f99;cursor:n-resize&#125; .cplu:before &#123; content:&#39;+&#39;&#125; .cplu:after &#123; content:&#39; &#39;&#125;
.cmin &#123;color:#99f;cursor:s-resize&#125; .cmin:before &#123; content:&#39;\2212&#39;&#125; .cmin:after &#123; content:&#39; &#39;&#125;
.cplu:hover,.cplu:active &#123;color: red;&#125;
.cmin:hover,.cmin:active &#123;color: blue;&#125;

Осталось сказать, что сам комментарий имеет классы .c0, .c1, .c2, .c3, .c4, .c5, .c6
c0 — обычный
c1 — скрытый (подзамкам, админу и автору вышестоящего комментария, если это был ответ ему) виден с зеленым фоном
c2 — кажется, комментарий админа
остальные — не помню, не используются в реальной жизни

И последнее. У комментария есть переменная level, которая 0 для комментария нулевого уровня, а 1, 2, 3 и т.п. для соответствующего по глубине в ветке. Сейчас в движке этот level тупо умножается на 50px (точно не помню) и для основного DIV комментария (того, у которого id, внутрь которого помещается вышеописанный темплейт) делается отступ margin-left: (level*50) px


Не сказать, чтобы я считал эту систему умной, но просто другой я не придумал. Если надо в ней что-то поменять — с удовольствием поменяю.]]></description>
</item>

<item>
	<title>2015/04/12 - Занимательная информатика</title>
	<link>http://lleo.me/blog/2015/04/12</link>
	<comments>http://lleo.me/blog/2015/04/12</comments>
	<pubDate>Sun, 12 Apr 2015 00:00:00 +0400</pubDate>
	<lastBuildDate>Sun, 12 Apr 2015 03:21:08 +0400</lastBuildDate>
	<guid isPermaLink='true'>http://lleo.me/blog/2015/04/12</guid>
	<author>http://lleo.me/blog/</author>
	<description><![CDATA[Вопрос: два компа под Линуксом соединены в сеть, на одном поднят SMB-сервер Samba, на другом — SMB клиент (cifs). При копировании длинного файла на сервер записывается ровно 2048Мб, после чего возникает ошибка. В каких настройках проблема?

Ответ под катом.
[ ТЕКСТ ПОД КАТОМ: Доступен только в оригинальной заметке на сайте ]
]]></description>
</item>


</channel>
</rss>