<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Erinome Lane</title>
	<atom:link href="https://tt.erinome.net/feed" rel="self" type="application/rss+xml" />
	<link>https://tt.erinome.net</link>
	<description>a bit of this, a bit of that...</description>
	<lastBuildDate>Mon, 23 Mar 2026 12:51:51 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Осторожно, мошенники!</title>
		<link>https://tt.erinome.net/2021/08/939</link>
		<comments>https://tt.erinome.net/2021/08/939#comments</comments>
		<pubDate>Sat, 28 Aug 2021 05:43:29 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[IRC-викторина]]></category>
		<category><![CDATA[quiz]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=939</guid>
		<description><![CDATA[Обратите внимание, что если кто-то якобы от имени администрации сайта или игры &#8220;Викторины&#8221; в IRC-чатах просит вас срочно переслать куда-то деньги для оплаты &#8220;аренды серверов&#8221; или чего-то подобного, то вы на 146% столкнулись с неумелой попыткой мошенничества: мы не арендуем &#8230; <a href="https://tt.erinome.net/2021/08/939">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Обратите внимание, что если кто-то якобы от имени администрации сайта или игры &#8220;Викторины&#8221; в IRC-чатах просит вас срочно переслать куда-то деньги для оплаты &#8220;аренды серверов&#8221; или чего-то подобного, то вы на 146% столкнулись с неумелой попыткой мошенничества: мы не арендуем и никогда не арендовали серверы, и уж тем более ничего не просим у пользователей. Просто игнорируйте все такие запросы.</p>
<p>Но если же вы все-таки хотите оказать добровольную финансовую поддержку, то достоверные реквизиты указаны только в правом нижнем блоке &#8220;Gratitudes&#8221; на данном сайте. В этом случае пожертвованные деньги будут потрачены сугубо на покупку шоколадок.</p>
<p>Надеемся на понимание.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2021/08/939/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Реклама на яндексе и в яндекс.почте</title>
		<link>https://tt.erinome.net/2020/07/922</link>
		<comments>https://tt.erinome.net/2020/07/922#comments</comments>
		<pubDate>Wed, 08 Jul 2020 21:06:35 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[жтс]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=922</guid>
		<description><![CDATA[На днях на одном из моих почтовых ящиков при входе вдруг был замечен огромный тултип, гласивший, что Яндекс рад мне сообщить о возможности подключения платной опции для почты: она, дескать, за символический стольник ежемесячно позволит мне отключить рекламу, получить приоритетную &#8230; <a href="https://tt.erinome.net/2020/07/922">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>На днях на одном из моих почтовых ящиков при входе вдруг был замечен огромный тултип, гласивший, что Яндекс рад мне сообщить о возможности подключения платной опции для почты: она, дескать, за символический стольник ежемесячно позволит мне отключить рекламу, получить приоритетную техподдержку, а также какие-то гигабайты в яндекс-диск, который, вообще-то, не то чтобы относился к почте. В общем, всё это, конечно, прекрасно, но до этого дня у меня реклама была вообще выключена &#8211; для этого существовала доступная для всех и бесплатно опция. Почему просто прямым текстом не написать, что в сервисе теперь будет неотключаемая забесплатно реклама? Вместо этого Яндекс пытается нагло делать вид, что сейчас [за деньги] можно получить расширенный функционал, когда на деле просто прежние бесплатные опции становятся платными &#8211; и это откровенно злит.<span id="more-922"></span></p>
<div style="background: darkgray; padding: 6px 3px;">
Я решил размещать здесь и поддерживать в более-менее актуальном состоянии свои фильтры для uBlock-а:</p>
<p><span style="color: darkred;">Обновление от <strong>22/03/2026</strong></span></p>
<pre class="console">! страницы почты
mail.yandex.ru##div[data-testid="page-layout_right-column_container_v1"], div[data-testid="content-header_container"] > div:not([data-testid="toolbar-layout_container"]), div.Modal.Modal_visible[class*="Fullscreen_root_"]

! страница погоды
yandex.ru##div[class*="AppLayoutTypeMain_centerWrapper_"] aside[class*="AppLayoutTypeMain_right_"], [class*="MainPage_topBlockWithMoney_"], [class*="AppForecastMoney_wrap_"], [class*="Money_ecomFooter_"], [class*="AppMoney_wrap_"], [class*="AppPromoInner_container_"]

! страница поиска
ya.ru##div[class*="body_"] > aside ~ div, .Distribution, #search-result-aside
</pre>
<p>А ниже текст старого поста.</p></div>
<p>Реклама на тот момент выглядела как отдельная строчка в перечне писем + три огромных графических баннера по левой стороне экрана, под категориями (в прошлом, насколько вспоминается, там были 2-3 баннера суммарного размера как один нынешний). Разумеется, опция отключения рекламы из настроек почты безвозвратно исчезла. Помимо этого, что характерно, обнаружилось, что на паре других яндекс.учеток никакого предложения покупки &#8220;про-версии&#8221; почты нет, как нет и рекламы. <em>Update: спустя некоторое время она появилась и там тоже.</em></p>
<p>К сожалению, никаких денег на оплату яндекс.закидонов мне не хватает, поэтому предпримем попытку убрать это безобразие с глаз долой при помощи uBlock Origin.</p>
<p>Яндекс.реклама отличается тем, что каждый раз генерирует себе новые случайные идентификаторы, но в почте пока что прибивается следующими правилами:</p>
<pre class="console">mail.yandex.ru##.mail-Layout-Content > .ns-view-advanced-search-box + div, .mail-Layout-Aside-Inner > .ns-view-left-box .qa-LeftColumn > div:last-Child, .mail-Layout-Aside-Inner > .ns-view-left-box .ns-view-react-left-column + div, .tooltip_theme_promo, .pushPromo</pre>
<p>Кроме того, некоторая часть назойливых предложений по установке яндекс.браузера выпиливается следующим образом:</p>
<pre class="console">yandex.ru##.distr-promo-head, .distr-popup, .dist-popup, .bottom-popup, .serp-footer_type_distro, .distr-smartbanner-loader
yandex.ru##.advert, .b-statcounter + div, #bk-stripe</pre>
<p>Не тая особенных надежд, можно с почти полной уверенностью говорить, что эти правила придется рано или поздно менять, но, возможно, к тому времени можно будет успеть поменять и почту на что-то более приемлемое.</p>
<p>PS: Яндекс.новации последнее время, кажется, падают все ниже и ниже. Когда-то давно они сделали сервис почты-для-домена, включая днс-хостинг, и у него был какой-никакой API для автоматического управления (читай &#8211; DDNS). Затем его &#8220;проапгрейдили&#8221; до яндекс.коннекта, без предупреждений снеся старое API, но так и не сделав новое на замену. Теперь вот игры в какие-то &#8220;прошечки&#8221; в попытке сделать платным то, что вот только вчера было полностью бесплатным, но при этом представить всё это так, как будто в этом есть что-то новое и новаторское. Куда еще смогут упасть?</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2020/07/922/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>qemu и эмуляция ARM</title>
		<link>https://tt.erinome.net/2020/02/912</link>
		<comments>https://tt.erinome.net/2020/02/912#comments</comments>
		<pubDate>Tue, 25 Feb 2020 07:52:13 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=912</guid>
		<description><![CDATA[QEMU позволяет запускать программы, собранные для архитектур, отличающихся от архитектуры хост-машины, как известно. Чуть менее известно то, что с его помощью можно запустить эмулятор всей ЭВМ целиком и установить в него целую операционную систему иной архитектуры. И если с запуском &#8230; <a href="https://tt.erinome.net/2020/02/912">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>QEMU позволяет запускать программы, собранные для архитектур, отличающихся от архитектуры хост-машины, как известно. Чуть менее известно то, что с его помощью можно запустить эмулятор всей ЭВМ целиком и установить в него целую операционную систему иной архитектуры. И если с запуском x86_64 никаких проблем не возникнет (а на обычных PC по факту это просто виртуализация, а не эмуляция), то при попытке запустить эмулятор для ARM может обнаружиться, что систему туда так просто не установить: у эмулятора ARM нет ничего похожего на BIOS, который любезно организует старт установки с виртуального дисковода или флешки, а после установки &#8211; будет передавать загрузку в grub или его аналоги.<span id="more-912"></span></p>
<p>Попробуем организовать эмулятор для ARMv7 при помощи QEMU 4.20 и установим какой-нибудь Linux.</p>
<p>Для начала нам понадобится скачать так называемый netboot образ системы для armhf, состоящий из двух компонент: vmlinuz и initrd.gz. После ряда экспериментов выяснилось, что современные инсталляторы Ubuntu по умолчанию непригодны для этих целей, так что возьмем Debian Buster<a href="http://ftp.debian.org/debian/dists/buster/main/installer-armhf/current/images/netboot/" target="_blank" rel="noopener">[1]</a>.</p>
<p>Подготовим файл образа &#8220;диска&#8221;, в который будем устанавливать систему:</p>
<pre class="console">qemu-img create -f qcow2 debian.qcow2 8G</pre>
<p>В ряде инструкций рекомендуется подготовить сеть, подняв на хост-машине tap-интерфейс, что позволит иметь возможность достучаться с хост-машины в гостевую, но для упрощения ситуации запустим сеть в usermode &#8211; она работает достаточно быстро и для ряда задач её хватит.</p>
<p>Собираем файлы в одном месте и запускаем эмулятор со следующими параметрами:</p>
<pre class="console">qemu-system-arm -smp 4 -m 1024 -M virt \
   -kernel vmlinuz \
   -initrd initrd.gz \
   -append "root=/dev/ram" \
   -netdev user,id=n1
   -device virtio-net-device,netdev=n1 \
   -drive if=none,file=debian.img,format=qcow2,id=hd \
   -device virtio-blk-device,drive=hd \
   -no-reboot</pre>
<p>Параметры:</p>
<ul>
<li>smp &#8211; количество ядер;</li>
<li>m &#8211; объем памяти;</li>
<li>M &#8211; тип машины, virt &#8211; абстрактно-виртуальный ARM;</li>
<li>netdev &#8211; тип сети, user &#8211; самый простой вариант, не требующий настройки хост-машины;</li>
<li>device virtio-net-device &#8211; устройство &#8220;сетевой карты&#8221;, и выбирать следует именно это, а не упомянутое в различных инструкциях, т.к. иначе с огромной вероятностью вы наткнетесь на сообщение о том, что инсталлятор системы не обнаружил никаких сетевых устройств в системе;</li>
<li>drive if=none,file=debian.img,format=qcow2 &#8211; образ жесткого диска;</li>
<li>device virtio-blk-device &#8211; устройство &#8220;жесткого диска&#8221;, аналогично сети, этот вариант обнаруживается установщиком, многие другие &#8211; нет;</li>
<li>no-reboot &#8211; перезапуск системы приведет к остановке эмулятора.</li>
</ul>
<p>Если запускаем qemu-system-arm в консоли без графического интерфейса, то дописываем &#8220;-nographic&#8221;.</p>
<p>Устанавливаем Debian как обычно. На количестве ядер не следует экономить, т.к. в процессе установки есть этапы, которые, по всей видимости, могут неплохо параллелиться, а однопоточная производительность эмулятора далека от производительности хост-машины: в среднем на установку системы уходило около часа на четырехъядерном Intel Xeon 3.5 GHz.</p>
<p>Ближе к концу установки инсталлятор ругнется на невозможность установки grub &#8211; так и должно быть в этом эмуляторе.</p>
<p>Далее, когда инсталлятор сообщит о завершении, выберите &#8220;Go back&#8221; и из главного меню установщика выберите пункт про вход в консоль. В консоли целевой диск, куда производилась установка, будет доступен по пути /target. Поскольку у эмулятора нет загрузчика, нам понадобится вытащить уже из установленной системы соответствующие ей vmlinuz и initrd.img. Для этого можно сделать <em>chroot /target</em> и, используя набор стандартных утилит &#8211; например, scp &#8211; откопировать файлы, находящиеся в /target/boot (а после chroot так просто в /boot) куда-нибудь вовне эмулятора. Если установленных утилит не хватает, то уже в chroot-е можно легко использовать apt и apt-get для установки недостающего. После копирования выходим из консоли и в меню инсталлятора выбираем пункт завершения установки. Когда установщик выполнит перезагрузку, эмулятор просто выключится согласно опции no-reboot.</p>
<p>Конечно, в качестве альтернативы можно вынуть vmlinuz и initrd из установленной системы и при помощи средств конвертации и распаковки qcow2 файлов &#8211; таких инструкций в интернете уйма. В этом случае прежде, чем что-то сделать с образом диска, не забывайте остановить эмулятор, чтобы не повредить образ.</p>
<p>Причина же, по которой изначально не удалось использовать современные образы Ubuntu, состоит в том, что в них после установки по малопонятной причине не генерируется файл initrd.img &#8211; в директории /target/boot есть битые симлинки на него, тогда как сам initrd отсутствует. [<strong>Update</strong>: Способ исправления был найден в комментариях на gist.github.com<a href="https://gist.github.com/takeshixx/686a4b5e057deff7892913bf69bcb85a#gistcomment-2876366" rel="noopener" target="_blank">[2]</a>]</p>
<p>Итак, после описанных действий у вас должен оказаться на руках образ debian.img с установленной ОС и файлы vmlinuz и initrd.img, взятые из этого же образа. Старые vmlinuz и initrd.gz с netboot-инсталлятором можно удалить &#8211; они больше не понадобятся. Теперь для запуска системы нужно переписать аргументы qemu-system-arm на следующие:</p>
<pre class="console">qemu-system-arm -smp 4 -m 1024 -M virt \
   -kernel vmlinuz \
   -initrd initrd.img \
   -append "root=/dev/vda2" \
   -netdev user,id=n1
   -device virtio-net-device,netdev=n1 \
   -drive if=none,file=debian.img,format=qcow2,id=hd \
   -device virtio-blk-device,drive=hd \
   -no-reboot</pre>
<p>Вот, в общем-то, и всё.</p>
<p>Для того, чтобы зайти извне в такую гостевую машину по SSH, можно заменить <em>-netdev user,id=n1</em> на <em>-netdev user,hostfwd=tcp::10022-:22,id=n1</em>, и тогда при подключении к порту 10022 на хост-машине соединение будет перенаправлено на 22 порт гостевой машины. Либо воспользоваться ssh-туннелем, подняв из гостевой машины подключение к удаленному ssh-серверу с дополнительным параметром <em>-R 10022:localhost:22</em> &#8211; в этом случае порт 10022 на удаленном сервере будет перенаправлен на порт 22 гостевой машины. </p>
<p>Теперь можно пробовать собирать программы нативным компилятором нужной архитектуры, а не кросс-компиляцией. Ну или зачем там вы ещё запускали этот эмулятор.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2020/02/912/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bitrix, opcache и утечки памяти</title>
		<link>https://tt.erinome.net/2019/09/904</link>
		<comments>https://tt.erinome.net/2019/09/904#comments</comments>
		<pubDate>Sun, 22 Sep 2019 16:23:07 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=904</guid>
		<description><![CDATA[Появилась задача разобраться, отчего некий самописный компонент битрикса, где в цикле выполняется охренеллиард однотипных запросов к базе данных, после обновления PHP с 7.1 на 7.2 внезапно начал падать то в пустой экран, то в классический Fatal error: Allowed memory size &#8230; <a href="https://tt.erinome.net/2019/09/904">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Появилась задача разобраться, отчего некий самописный компонент битрикса, где в цикле выполняется охренеллиард однотипных запросов к базе данных, после обновления PHP с 7.1 на 7.2 внезапно начал падать то в пустой экран, то в классический <em>Fatal error: Allowed memory size of &#8230; bytes exhausted</em>.<span id="more-904"></span></p>
<p>После изучения означенного вопроса оказалось, что суть проблемы сводится к битриксовому API CIBlockElement::GetList() и соответствующему ему GetNext(), которые при <em>некоторых</em> условиях переставали высвобождать память после <em>каждого</em> своего вызова. Очевидно, что после попытки выполнения их по нескольку десятков тысяч раз внутри одного скрипта (который по расписанию перегенерирует карту сайта), разрешенный объем памяти в PHP довольно быстро заканчивался.</p>
<p>Тот факт, что ранее тот же самый код работал без подобных проблем, со временем вывел расследование на opcache, а конкретно &#8211; к оптимизации <em>ZEND_OPTIMIZER_PASS_6 (1&lt;&lt;5) /* DFA based optimization */</em>. По счастью, настройки opcache позволяют выбирать активные оптимизации и отключать те, что могут вызывать проблемы. Соответственно, в конфигурацию была добавлена следующая опция, отключающая только проблемную оптимизацию и оставляющая все остальные:</p>
<pre class="console">opcache.optimization_level=0x7FFEBFDF</pre>
<p>Понятно, что это могло привести к какой-то деградации производительности в opcache, но при выполнении означенных ранее циклов полностью перестала утекать память.</p>
<p>Для справки, полный список опциональных оптимизаций:</p>
<pre class="console">#define ZEND_OPTIMIZER_PASS_1		(1&lt;&lt;0)   /* CSE, STRING construction     */
#define ZEND_OPTIMIZER_PASS_2		(1&lt;&lt;1)   /* Constant conversion and jumps */
#define ZEND_OPTIMIZER_PASS_3		(1&lt;&lt;2)   /* ++, +=, series of jumps      */
#define ZEND_OPTIMIZER_PASS_4		(1&lt;&lt;3)   /* INIT_FCALL_BY_NAME -&gt; DO_FCALL */
#define ZEND_OPTIMIZER_PASS_5		(1&lt;&lt;4)   /* CFG based optimization       */
#define ZEND_OPTIMIZER_PASS_6		(1&lt;&lt;5)   /* DFA based optimization       */
#define ZEND_OPTIMIZER_PASS_7		(1&lt;&lt;6)   /* CALL GRAPH optimization      */
#define ZEND_OPTIMIZER_PASS_8		(1&lt;&lt;7)   /* SCCP (constant propagation)  */
#define ZEND_OPTIMIZER_PASS_9		(1&lt;&lt;8)   /* TMP VAR usage                */
#define ZEND_OPTIMIZER_PASS_10		(1&lt;&lt;9)   /* NOP removal                 */
#define ZEND_OPTIMIZER_PASS_11		(1&lt;&lt;10)  /* Merge equal constants       */
#define ZEND_OPTIMIZER_PASS_12		(1&lt;&lt;11)  /* Adjust used stack           */
#define ZEND_OPTIMIZER_PASS_13		(1&lt;&lt;12)  /* Remove unused variables     */
#define ZEND_OPTIMIZER_PASS_14		(1&lt;&lt;13)  /* DCE (dead code elimination) */
#define ZEND_OPTIMIZER_PASS_15		(1&lt;&lt;14)  /* (unsafe) Collect constants */
#define ZEND_OPTIMIZER_PASS_16		(1&lt;&lt;15)  /* Inline functions */

#define ZEND_OPTIMIZER_IGNORE_OVERLOADING	(1&lt;&lt;16)  /* (unsafe) Ignore possibility of operator overloading */</pre>
<p>PS: Всё это не было бы особо мозголомно, если бы не тот факт, что вся эта проблема наблюдалась на одном сайте и не наблюдалась на другом &#8211; в разных пулах PHP-FPM в рамках одного и того же сервера. Объяснение тому оказалось прямолинейным: там, где проблема не наблюдалась, opcache отчего-то не функционировал. Нет, не был выключен в настройках &#8211; он был включен, но просто перестал работать. После перезапуска FPM проблема начала одинаково воспроизводиться на обоих сайтах. Впоследствии, к слову, это же вынудило переустановить PHP из репозитория Remi, раз в официальном и версия PHP получала лишь обновления безопасности к старому релизу, а не обновления к более новым, и происходили подобные вещи. К сожалению, начальную проблему с DFA это обновление не исправило.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2019/09/904/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FTP, passive mode и RHEL8</title>
		<link>https://tt.erinome.net/2019/08/901</link>
		<comments>https://tt.erinome.net/2019/08/901#comments</comments>
		<pubDate>Thu, 15 Aug 2019 08:36:36 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=901</guid>
		<description><![CDATA[Мамонтовый протокол FTP предусматривает два режима работы для передачи данных &#8211; так называемые активный и пассивный режимы. Для активного режима требуется, чтобы у клиента был публичный IP-адрес и открытые порты, для пассивного &#8211; аналогичное должно быть сделано со стороны сервера. &#8230; <a href="https://tt.erinome.net/2019/08/901">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Мамонтовый протокол FTP предусматривает два режима работы для передачи данных &#8211; так называемые активный и пассивный режимы. Для активного режима требуется, чтобы у клиента был публичный IP-адрес и открытые порты, для пассивного &#8211; аналогичное должно быть сделано со стороны сервера. Удивительно то, что большинство современных инструкций по настройке vsftpd или proftpd предлагают просто выделить конкретный диапазон портов, прописать их в конфигурации FTP-сервера и разрешить к ним доступ в файрволе. Но зачем это делать, когда долгие годы существуют изощренные системы полностью автоматического разрешения доступа к портам при работе с FTP? А потому что по умолчанию они не работают.<span id="more-901"></span></p>
<p>Наглядный пример &#8211; RHEL8. Для чистого iptables и аналогов есть модули nf_conntrack_helper и, в частности, nf_conntrack_ftp. Интернет подсказывает, что в ядрах версии 4.7 и выше они по умолчанию отключены и требуют или ручного включения, или отдельной маркировки соединений. Но вот только у RHEL8 предлагается использовать надстройку FirewallD, мануал которого ещё в 2016 году <a href="https://firewalld.org/2016/10/automatic-helper-assignment" rel="noopener" target="_blank">упоминал автоматическое использование</a> соответствующего helper-а, если в конфигурации файрвола активирован стандартный сервис ftp, открывающий доступ к 21-му порту. Так, утверждается, что в выбранном по умолчанию режиме <em>AutomaticHelpers = system</em> должно проверяться значение <em>/proc/sys/net/netfilter/nf_conntrack_helper</em> (которое в >4.7 выключено) и, в зависимости от него, будут предприниматься необходимые меры для автоматического открывания портов для передачи данных через FTP. Но проблема в том, что этого не происходит.</p>
<p>Практический же опыт показывает, что помимо активации в файрволе сервиса ftp всё же необходимо в firewalld.conf дописать <em>AutomaticHelpers = on</em>, после чего никаких отдельных настроек портов для passive mode FTP не понадобится. Отчего это не работает в режиме <em>system</em> в релизной версии RHEL8 &#8211; неизвестно.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2019/08/901/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Статическая сборка pdns_server</title>
		<link>https://tt.erinome.net/2019/08/898</link>
		<comments>https://tt.erinome.net/2019/08/898#comments</comments>
		<pubDate>Sat, 10 Aug 2019 20:11:47 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=898</guid>
		<description><![CDATA[При ручной сборке в ./configure у PowerDNS Authoritative Server есть ключи &#8211;enable-static и &#8211;enable-static-boost, позволяющие собрать бинарники статически, поскольку не всегда есть время и возможности угадывать, что и, главное, каких именно версий окажется установлено или доступно к установке на целевой &#8230; <a href="https://tt.erinome.net/2019/08/898">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>При ручной сборке в <em>./configure</em> у <strong>PowerDNS Authoritative Server</strong> есть ключи <em>&#8211;enable-static</em> и <em>&#8211;enable-static-boost</em>, позволяющие собрать бинарники статически, поскольку не всегда есть время и возможности угадывать, что и, главное, каких именно версий окажется установлено или доступно к установке на целевой операционке. Если вам не повезло иметь операционку, где готового пакета с pdns не существует, а готовый к сборке чего попало сервер уже налажен.</p>
<p>Вот только при запуске успешно собранного бинарника можно увидеть ошибку <em>pdns_server: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.26&#8242; not found (required by pdns_server)</em><span id="more-898"></span></p>
<p>Она говорит о том, что указанная библиотека ни черта не прилинковалась статически.</p>
<p>Заставить ее это сделать можно дописыванием <em>LDFLAGS</em> перед запуском <em>./configure</em>:</p>
<pre class="console">LDFLAGS="-static-libstdc++" ./configure --with-modules="gmysql" --without-lua --enable-static --enable-static-boost --prefix=/</pre>
<p>Это отвяжет зависимость от версии <em>libstdc++</em> на целевой машине.</p>
<p>Говорят, для другого софта может пригодиться вбивание <em>-static-libgcc</em>, если он собирается CC, а общий <em>-static</em> попытается собрать всё остальное статически.</p>
<p>А так-то понятно, что лучше не собирать на коленке вручную, а использовать готовые пакеты требуемого софта для имеющейся операционной системы. Когда они есть в природе. Правда ведь, RHEL8?</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2019/08/898/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Рандомизация фраз на Roborock S50/S55</title>
		<link>https://tt.erinome.net/2019/05/885</link>
		<comments>https://tt.erinome.net/2019/05/885#comments</comments>
		<pubDate>Wed, 15 May 2019 16:12:00 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mobile-tech]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=885</guid>
		<description><![CDATA[Roborock S5 &#8211; серия недорогих роботов-пылесосов с лидаром, входящая в категорию товаров для &#8220;умного дома&#8221; от Xiaomi. Дистанционное управление со смартфона и root-доступ ко встроенной операционке на базе Linux прилагаются. Наличие root-доступа предоставляет возможность немного поиграться с системой. Например, по &#8230; <a href="https://tt.erinome.net/2019/05/885">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Roborock S5 &#8211; серия недорогих роботов-пылесосов с лидаром, входящая в категорию товаров для &#8220;умного дома&#8221; от Xiaomi. Дистанционное управление со смартфона и root-доступ ко встроенной операционке на базе Linux прилагаются.<span id="more-885"></span></p>
<p>Наличие root-доступа предоставляет возможность немного поиграться с системой. Например, по умолчанию на каждое конкретное действие робот отвечает одной единственной фразой. И хорошо, если не по-китайски. Не очень весело, правда?</p>
<p>Попробуем сделать так, чтобы вместо этого робот отвечал случайной репликой из соответствующей категории фраз. Для этих целей будет использоваться самописная пользовательская файловая система fuse, сделанная на базе <a href="https://www.cs.nmsu.edu/~pfeiffer/fuse-tutorial/" target="_blank" rel="noopener">bbfs</a>. Смысл состоит в том, чтобы при обращении к какому-либо файлу со звуком &#8211; например, <em>sound.wav</em> &#8211; модифицированная ФС проверяла наличие рядом файлов с именами <em>sound_1.wav</em>, <em>sound_2.wav</em> и т.д. и случайно выбирала один из них. Все прочие же действия bbfs просто пробрасывает в нижележащую файловую систему без изменений.</p>
<h2>Ручная установка</h2>
<p>Инструкция далее предполагает минимальное умение пользоваться linux-терминалом через putty и (win)scp, а так же уже рутированное ПО на роботе. Если это не для вас &#8211; смело пропускайте этот раздел и переходите ниже.</p>
<ol>
<li>Сначала установим нужную локализацию, на базе которой будет строиться наша &#8211; например, при помощи WIN-MIROBO. В результате на роботе по пути <em>/mnt/data/rockrobo/sounds</em> появится каталог с набором звуковых wav-файлов.</li>
<li>Делаем копию этого каталога в соседний, например: <em>/mnt/data/rockrobo/sounds_multi</em>, не забываем сделать <em>chown</em> на <em>ruby</em> (или другого пользователя, не <em>root</em>) как каталога <em>sounds</em>, так и <em>sounds_multi</em> (для удобной заливки новых wav-файлов через <em>winscp</em>).</li>
<li>Установим поддержку файловых систем <em>fuse</em>, используя стандартные пакеты к <em>Ubuntu 14.04</em> для armhf: понадобятся libfuse2_2.9.2-4ubuntu4.14.04.1_armhf.deb и fuse_2.9.2-4ubuntu4.14.04.1_armhf.deb с <a href="https://launchpad.net/~ubuntu-security/+archive/ubuntu/ppa/+build/7431580" target="_blank" rel="noopener">launchpad.net</a>. Для установки забрасываем файлы в робота и используем <em>dpkg -i имя_файла</em>.</li>
<li>Забрасываем в робота собранный бинарник файловой системы <a href="https://fs.erinome.net/roborock/" target="_blank" rel="noopener">bbfs</a> и кладем его, к примеру, в <em>/usr/local/bin</em>, делаем его запускаемым (<em>chmod +x</em>)</li>
<li>В файле <em>/etc/fuse.conf</em> раскомментируем опцию <em>user_allow_other</em>, т.к. в противном случае из-под root-а не будут видны файлы в смонтированных пользователем каталогах, делаем этот файл читаемым для всех (<em>chmod +r</em>).</li>
</ol>
<p>Теперь мы готовы запустить <em>bbfs</em>. Для этого заходим из-под <em>ruby</em> (или другого пользователя, главное &#8211; не <em>root</em>) и набираем следующую команду: <code>bbfs -o nonempty,allow_root /mnt/data/rockrobo/sounds_multi /mnt/data/rockrobo/sounds</code>. После этого в каталоге <em>sounds</em> будут показаны все файлы из <em>sounds_multi</em>, но при выборе основного файла <em>sounds/sound.wav</em> в действительности будет запрошен случайным образом либо <em>sounds_multi/sound_N.wav</em>, либо исходный <em>sounds_multi/sound.wav</em>.</p>
<p>Отметим, что N ∈ [1;20] &#8211; и только в порядке возрастания (т.о. если файла <em>sound_1.wav</em> нет, то <em>sound_2.wav</em> даже проверяться не будет).</p>
<p>Для размонтирования обратно используем команду <code>fusermount -u /mnt/data/rockrobo/sounds</code>, и в <em>/mnt/data/rockrobo/sounds</em> возвращается его исходное содержимое.</p>
<p>Если вручную все завелось корректно, то для автоматического старта при запуске робота можно добавить в <em>/etc/rc.local</em> следующую строку: <code>su ruby -c "bbfs -o nonempty,allow_root /mnt/data/rockrobo/sounds_multi /mnt/data/rockrobo/sounds"</code>. Не забываем указывать правильного пользователя после <em>su</em> и не теряем кавычки.</p>
<h2>Предсобранные прошивки</h2>
<p>На сайте <a href="https://github.com/rand256/valetudo/releases" target="_blank" rel="noopener">github.com/rand256</a> есть предсобранные прошивки с рут-доступом, Valetudo RE и предустановленной в том числе и системой рандомизации фраз. После установки такой прошивки необходимо только создать на роботе директории /mnt/data/rockrobo/sounds и /mnt/data/rockrobo/sounds_multi и положить в последнюю набор файлов озвучки, включающих разные перефразированные реплики под каждое событие: например, start.wav, start_1.wav, start_2.wav.</p>
<p>Таким образом, после перезагрузки робот станет использовать для одного и того же события разнообразные слова вместо постоянного повторения единственной фразы &#8211; и это звучит намного живее и естественнее.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2019/05/885/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>linux: несколько IP на один NIC</title>
		<link>https://tt.erinome.net/2019/04/879</link>
		<comments>https://tt.erinome.net/2019/04/879#comments</comments>
		<pubDate>Mon, 15 Apr 2019 13:18:47 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=879</guid>
		<description><![CDATA[Заметка, чтобы не забыть. Варварство без специфичных скриптов того или иного дистрибутива, с циничным пользованием deprecated утилит. Заведение IP: ifconfig eth0:1 &#60;ip-address&#62; netmask &#60;netmask&#62; up Если это роутер с NAT или просто нужна возможность организовать внешние соединения с этого IP &#8230; <a href="https://tt.erinome.net/2019/04/879">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Заметка, чтобы не забыть. Варварство без специфичных скриптов того или иного дистрибутива, с циничным пользованием deprecated утилит.<span id="more-879"></span></p>
<p>Заведение IP:</p>
<pre class="console">ifconfig eth0:1 &lt;ip-address&gt; netmask &lt;netmask&gt; up</pre>
<p>Если это роутер с NAT или просто нужна возможность организовать внешние соединения <em>с</em> этого IP (а не <em>на</em> него), то требуется новая таблица в <em>/etc/iproute2/rt_tables</em>. Далее:</p>
<pre class="console">ip route add &lt;network&gt;/29 dev eth0:1 src &lt;ip-address&gt; table &lt;table&gt;
ip route add default via &lt;network gateway&gt; table &lt;table&gt;
ip route add 192.168.0.0/24 dev eth1 table &lt;table&gt;
ip rule add from &lt;network&gt; table &lt;table&gt;</pre>
<p>Посмотреть, что получилось:</p>
<pre class="console">ip rule show
ip route list table &lt;table&gt;</pre>
<p>Задать маршруты по умолчанию тем же <code>ip route</code>, но без <code>table</code>. Правила iptables для NAT типовые.</p>
<p>Если удобоваримый результат достигнут, далее можно искать специфичные скрипты того или иного дистрибутива для менее варварской настройки. Если их нет, то rc.local.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2019/04/879/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Miranda + ICQ</title>
		<link>https://tt.erinome.net/2018/04/868</link>
		<comments>https://tt.erinome.net/2018/04/868#comments</comments>
		<pubDate>Thu, 05 Apr 2018 14:52:39 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=868</guid>
		<description><![CDATA[Последние год-два при попытке использовать ICQ в неофициальных клиентах вроде Miranda можно было столкнуться с тем, что часть клиентов всегда отображается находящейся в сети, даже когда это совсем не так, а также с фактом наличия пропущенных оффлайновых сообщений. Связано это &#8230; <a href="https://tt.erinome.net/2018/04/868">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Последние год-два при попытке использовать ICQ в неофициальных клиентах вроде Miranda можно было столкнуться с тем, что часть клиентов всегда отображается находящейся в сети, даже когда это совсем не так, а также с фактом наличия пропущенных оффлайновых сообщений.<span id="more-868"></span></p>
<p>Связано это с использованием любыми официальными клиентами (в т.ч. веб-интерфейсом) &#8220;обновленного&#8221; протокола ICQ, в котором клиент считается всегда находящимся в как-бы-в-сети, а также при подключении предполагает, что настоящий клиент самостоятельно запросит непрочтенные оффлайновые сообщения, висящие на псевдоонлайновом статусе, а не будет ждать, пока в него их насильно запихнут.</p>
<p>И если со статусами ничего сделать не получится, то с неприемом оффлайновых сообщений кое-как разобраться можно:</p>
<p>1. Добавляем в контакты бота по имени <em>aolsystemmsg</em>;<br />
2. Отправляем ему единицу &#8211; <em>1</em>.</p>
<p>Это разлогинит все имеющиеся сессии, включая псевдоонлайновые, кроме текущей. Если после этого заходить в ICQ <em>только</em> со старых клиентов, то они будут вполне корректно получать оффлайновые сообщения. Естественно, любой заход через современный официальный клиент приведет к тому, что его сессия после выхода останется висеть &#8220;в сети&#8221; и потребует нового сброса псевдоонлайновых сессий.</p>
<p>ЗЫ: А почему это до сих пор не исправят разработчики сторонних клиентов &#8211; так, похоже, никому это уже и не нужно.<br />
ЗЗЫ: Бот отвечает ещё до отправки вашего запроса. Машины времени и всё такое, да.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2018/04/868/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Акадо &#8217;18 [или никому не верь]</title>
		<link>https://tt.erinome.net/2018/03/859</link>
		<comments>https://tt.erinome.net/2018/03/859#comments</comments>
		<pubDate>Fri, 30 Mar 2018 17:30:05 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=859</guid>
		<description><![CDATA[Чуть менее 10 лет назад я уже однажды распрощался с этим провайдером (что характерно, никогда к нему не подключаясь &#8211; он просто в то время мог позволить себе скупать чужие сети). Условия по тем временам складывались совсем не в его &#8230; <a href="https://tt.erinome.net/2018/03/859">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Чуть менее 10 лет назад я уже однажды распрощался с этим провайдером (что характерно, никогда к нему не подключаясь &#8211; он просто в то время мог позволить себе скупать чужие сети). Условия по тем временам складывались совсем не в его пользу, но теперь в какой-то момент времени оказалось, что у него можно получить чуть более лучший набор услуг, чем у моего прежнего ISP, при этом платя примерно в 1,94 раза меньше денег. А кроме того можно было бы ожидать, что резалка-крайне-запрещенных-по-мнению-роскомпозора-сайтов там будет работать не настолько отвратительно хотя бы потому, что хуже вряд ли есть куда. Так, спрашивается, почему бы и нет?<span id="more-859"></span></p>
<h3>Оформление заявки на сайте</h3>
<p>Заполнение формы заявки отличилось тем, что после нажатия на кнопку &#8220;Отправить&#8221; она радостно плевалась ошибкой, что я, бестолочь, не соизволил выбрать улицу. Пару раз вернувшись обратно, я удостоверился в том, что форма указания адреса, в целом, в курсе того, что в моем городе улицы для идентификации адресов не используются, но вот форме подключения про это никто не сказал. Полагаю, что не требуется говорить о том, что после каждого ухода со страницы с заполненной формой, эта форма сбрасывалась.</p>
<p>Клерк в чате отказался отвечать, действительно ли данный провайдер категорически не хочет подключать пользователей из городов с нестандартным форматом адреса, и предложил звонок менеджеру.</p>
<h3>Оформление заявки менеджером</h3>
<p>Описав менеджеру необходимые условия подключения, тот перепроверил адрес и заявил, что там подключение возможно только по коаксиальному кабелю, стоить будет в полтора раза дороже, а ещё и модем нужно будет брать в аренду. И никакой витой пары в моем доме нет и быть не может. &#8220;Точно?&#8221; &#8220;Точно!&#8221;</p>
<p>Странное дело, но мы, как неблагодарные абоненты, после таких новостей вдруг решили резко попрощаться, заявив, что на таких условиях нам это напрочь неинтересно. И ведь с нами попрощались, разве что безуспешно попытавшись прорекламировать ихнее телевидение, которое никого также нисколько не заинтересовало.</p>
<p>Однако, спустя символические пять минут, раздался звонок, суть содержания которого сводилась к следующему: они вдруг передумали, техническая возможность подключения по витой паре вдруг нашлась, а стоимость всего этого именно такая, как была изначально заявлена. Мистика? Ну, конечно.</p>
<h3>Ограничь всё, или как вытрясти денег</h3>
<p>По умолчанию этот провайдер подключает абонентов на приватные адреса из диапазона 10.0.0.0/8. А шел 2018 год. А про внешнюю динамику никто никогда и не слышал. Ну ладно, зато вдвое дешевле, причем за чуть более высокую скорость. </p>
<p>Но это не всё. Про DHCP и автоматическую раздачу сетевых настроек в этой сети тоже не слышали, поэтому при подключении на руки выдается листочек с параметрами сети. DNS-серверов в нем перечислено целых 4 штуки, и, похоже, не зря в интернете пишут, что они периодически падают (или падали в прошлом?). Но, казалось бы, зачем нам это &#8211; в интернете есть масса беспроблемных DNS-ок, можно просто пользоваться ими. Верно же? Неверно. Обращения ко внешним DNS-ам порезаны напрочь. Ну, вот просто так. И про GRE тоже можно не вспоминать.</p>
<p>Но решение, конечно, есть: купить статический внешний адрес. А это должно и разрыв по ценам подсократить. Впрочем, статика оказалась сравнительно недорогой &#8211; в сравнении с конкурентами. С обратной стороны это должно означать, что и здесь должен быть какой-то подвох.</p>
<h3>Приобретение статики</h3>
<p>В любом случае мне внешний адрес был нужен, поэтому я отправился смотреть возможности его получения. Официальный сайт утверждает о том, что можно отправить заявку через личный кабинет, и исполнена она будет не раньше, чем с первого дня следующего месяца, либо же советует обратиться к техподдержке, где могут быть и другие варианты. Я решил совместить приятное с полезным и обратиться к техподдержке через личный кабинет: невероятно, но там, в отличие от <del>мегафн</del>&#8230; в общем, там можно и такое.</p>
<p>Через двадцать минут после написания обращения, мне сообщили, что да, они могут подключить статический внешний адрес не дожидаясь начала месяца. Вот только денег при этом будет списано как за весь месяц целиком. Я мысленно поблагодарил работника техподдержки и мысленно пожелал провайдеру не лопнуть от жадности. После чего проследовал нажимать на кнопку автоматического подключения данной услуги в личном кабинете, потому что один фиг придется ждать.</p>
<h3>Тайна настроек, да и остальной набор тайн</h3>
<p>На следующее утро я обнаружил полностью неработающий интернет. После более внимательного осмотра я обнаружил, что сайт провайдера, как и личный кабинет, в общем-то доступны и работают. А уже их осмотр подсказал, что деньги за выделение статики (несколько сотен) и её поддержку (несколько копеек) списаны со счета уже прямо сейчас.</p>
<p>Вспоминая, что автоматически настройки в этой сети никто не выдает, вырисовывался логичный вывод: несмотря на утверждения, что через ЛК услугу можно получить только в следующем отчетном периоде, и несмотря на заверения о том, что если требовать ее подключить прямо сейчас, то у вас съедят впустую кучу денег &#8211; почему-то не сложилось ни то, ни другое. А адрес был выделен почти сразу, но сетевых настроек никто мне никуда не сообщил. И вообще, узнать их в ЛК нельзя. А со старыми настройками ничего не работает. По-моему, удобно.</p>
<h3><del>Доверяй, но проверяй.</del> Нет, просто проверяй</h3>
<p>Никуда не торопясь, ибо я заранее настроил роутер на работу с двумя провайдерами, я отписал в ту же удобную форму техподдержки в личном кабинете всё то, что я думаю о том, когда процесс подключения новых услуг организован на до такой степени высоком уровне. Заодно, запросил набор новых настроек, которые, естественно, тоже необходимо указывать вручную.</p>
<p>Ждать здесь пришлось на пару часов дольше, но в конечном счете я получил ответы на спрошенное. И не абы какие, а такие, что если внимательно вглядеться в полученную маску подсети, то можно было заметить, что указанный IP-адрес и указанный основной шлюз по таким настройкам попадают в разные подсети. Впрочем, по IP-калькулятору нетрудно подобрать более правильную маску, которая накроет оба адреса одновременно. Но домохозяек жалко.</p>
<h3>Резюме</h3>
<p>В общих чертах, оно работает. Просто на некоторые вещи лучше закрыть глаза.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2018/03/859/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
