<?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 &#187; Софт</title>
	<atom:link href="https://tt.erinome.net/cc/%d1%81%d0%be%d1%84%d1%82/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>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>Firefox Brief Extension (Erinome&#160;Edition)</title>
		<link>https://tt.erinome.net/2015/03/799</link>
		<comments>https://tt.erinome.net/2015/03/799#comments</comments>
		<pubDate>Thu, 26 Mar 2015 10:10:04 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=799</guid>
		<description><![CDATA[Расширение Brief &#8211; одно из наиболее удобных для работы с RSS-лентами в браузере Firefox, лишенном удобного встроенного RSS-ридера. Однако с недавних пор числящаяся последней версия 1.7.3 была помечена как несовместимая с Firefox 36 из-за невозможности корректного добавления новых лент. Отдельного &#8230; <a href="https://tt.erinome.net/2015/03/799">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Расширение <a href="https://addons.mozilla.org/en-us/firefox/addon/brief/" target="_blank">Brief</a> &#8211; одно из наиболее удобных для работы с RSS-лентами в браузере <strong>Firefox</strong>, лишенном удобного встроенного RSS-ридера. Однако с недавних пор числящаяся последней версия 1.7.3 была помечена как несовместимая с <strong>Firefox 36</strong> из-за невозможности корректного добавления новых лент.</p>
<p>Отдельного упоминания заслуживает тот факт, что добавленные ранее ленты обновлялись как положено, а то, что это расширение вдруг стало &#8220;критически&#8221; несовместимо с FF36, стало понятно только после того, как браузер самолично и без предупреждений его заблокировал после очередной синхронизации каталога дополнений. <s>Вы можете называть это как угодно &#8211; а на мой взгляд это беспредел.</s></p>
<p>Итак, на Github можно найти бета-версию Brief 2.0, которая полностью совместима с FF36+, но у нее есть несколько серьезных недостатков в сравнении с классической версией 1.7. Предлагаем вниманию модифицированную версию <strong>Brief 2.0b3e2</strong> (Erinome Edition), в которой часть из найденных недочетов была исправлена, а также в которую были внесены некоторые дополнения, которых не хватало и в версии 1.7.<span id="more-799"></span></p>
<p><strong>ВНИМАНИЕ!<br />
Эта статья была написана в 2015 году, и все описываемое в современных Firefox уже не работает.</strong></p>
<p>Список изменений <strong>Brief 2.0b3e</strong>:</p>
<ul>
<li>В режиме отображения заголовков возвращен показ времени публикации записей;</li>
<li>В режиме отображения заголовков развернутую запись теперь можно свернуть кликом по пустому пространству рядом с ее заголовком, а отдельная гигантская кнопка сворачивания убрана;</li>
<li>Активация опции невключения сообщений из выбранных лент в общее число непрочитанных сообщений более не приводит к тому, что такие сообщения перестают отображаться на закладках &#8220;Все записи&#8221; и &#8220;Сегодняшние записи&#8221;;</li>
<li>Изменен стандартный шаблон: записи теперь растягиваются на всю ширину экрана, а не висят по центру с пустым пространством вокруг;</li>
<li>Нажатие клавиши F5 во вкладке Brief теперь запускает процесс обновления всех лент;</li>
<li>Нажатие клавиши ENTER во вкладке Brief, когда курсор находится в адресной строке или панели поиска, более не приводит к непреднамеренному открытию ссылки из последней выделенной в ленте записи;</li>
<li>Обновлена и дополнена русификация;</li>
<li>Изменены параметры по умолчанию: режим отображения заголовков стал основным режимом, опция считать запись прочитанной по ее разворачиванию теперь по умолчанию включена.</li>
</ul>
<p>Список изменений <strong>Brief 2.0b3e2</strong> (16.03.15):</p>
<ul>
<li>Исправлено удаление записей из закладок.</li>
</ul>
<p>Список изменений <strong>Brief 2.0b3e3</strong> (26.03.15):</p>
<ul>
<li>При просмотре отдельных лент нажатие клавиши F5 приведет к обновлению только просматриваемой ленты.</li>
</ul>
<p>Известные проблемы:</p>
<ul>
<li>Производительность в сравнении с версией 1.7 оставляет желать лучшего.</li>
</ul>
<p>Скачать <a href="http://fs.erinome.net/tools/brief" target="_blank">Brief 2.0b3e</a> (Erinome Edition) можно из нашего архива.</p>
<p>Внимание: т.к. это дополнение является модом дополнения Brief, то во избежание возможных проблем перед его установкой оригинальный Brief должен быть деинсталлирован.</p>
<hr />
<p>This is a modified version of an unreleased Brief 2.0 Beta &#8211; Brief 2.0b3e2 Erinome Edition.</p>
<p>It was made in an attempt to partially restore classical 1.7 look-and-feel in newer Brief 2.0, where a lot of things was changed, as well as implement some additional features missing in 1.7.3. Below is a complete list of changes made to Brief 2.0 as it appeared at Github repositories as of 13.03.2015:</p>
<p>Changelog for <strong>Erinome Brief 2.0b3e</strong>:</p>
<ul>
<li>Item datetime is shown again in &#8220;View headlines&#8221; mode;</li>
<li>Item can be collapsed in &#8220;View headlines&#8221; mode by clicking on empty space below its header while huge ugly &#8220;collapse button&#8221; was removed;</li>
<li>Activating &#8220;Don&#8217;t include this feed&#8217;s items in overall unread count&#8221; option doesn&#8217;t result in items from such feed filtering out of &#8220;All Items&#8221; and &#8220;Today Items&#8221; views;</li>
<li>Default template changed: items are now full screen wide which much better fits current widescreen displays;</li>
<li>Pressing F5 in Brief tab now results in &#8220;Update All Feeds&#8221; action;</li>
<li>Pressing ENTER in Brief tab when writing a text into address bar or search bar no longer results in last item&#8217;s URL being opened along the default action;</li>
<li>Updated Russian translation (probably useless for English-speaking visitors but anyway);</li>
<li>Default preferences changed: &#8220;View headlines&#8221; is now the default view mode, option &#8220;Automatically mark item as read after I see it&#8221; is now checked by default.</li>
</ul>
<p>Changelog for <strong>Erinome Brief 2.0b3e2</strong> (16.03.15):</p>
<ul>
<li>Fixed unbookmarking an item.</li>
</ul>
<p>Changelog for <strong>Erinome Brief 2.0b3e3</strong> (26.03.15):</p>
<ul>
<li>Pressing F5 while viewing a single Feed now results in refreshing that Feed only.</li>
</ul>
<p>Brief (Erinome Edition) is available to download from <a href="http://fs.erinome.net/tools/brief" target="_blank">our fileserver</a>.</p>
<p>Attention: Please note that as this extension is a modified version of original Brief extension, you MUST uninstall original Brief from Firefox prior to installing this modified one. Who knows what might happen if you don&#8217;t do that?.. Boo!</p>
<p>There&#8217;re also some known issues in Brief 2.0 Beta: <s>un-bookmarking an item doesn&#8217;t work on the first try (try twice or thrice)</s> (fixed in 2.0b3e2), and the overall performance seems worse than it used to be in 1.7. If these issues will be fixed upstream, I&#8217;ll try to backport any fixes to the modified Brief version as well.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2015/03/799/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox GTWA Extension</title>
		<link>https://tt.erinome.net/2015/03/789</link>
		<comments>https://tt.erinome.net/2015/03/789#comments</comments>
		<pubDate>Fri, 06 Mar 2015 13:37:33 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=789</guid>
		<description><![CDATA[При мигрировании с браузера Opera 12 на линейку Firefox можно столкнуться с некоторыми отличиями в фунциональности и поведении браузера, которые стандартными средствами и известными расширениями вернуть к привычному виду не удается. Предлагаю вниманию небольшое самописное расширение GTWA &#8211; &#8220;Go&#160;To&#160;Web&#160;Address&#8221; v1.0.5. &#8230; <a href="https://tt.erinome.net/2015/03/789">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>При мигрировании с браузера <strong>Opera 12</strong> на линейку <strong>Firefox</strong> можно столкнуться с некоторыми отличиями в фунциональности и поведении браузера, которые стандартными средствами и известными расширениями вернуть к привычному виду не удается. Предлагаю вниманию небольшое самописное расширение <strong>GTWA</strong> &#8211; &#8220;<em>Go&nbsp;To&nbsp;Web&nbsp;Address</em>&#8221; v1.0.5. Это расширение для <strong>Firefox</strong> позволяет <em>переходить по текстовым ссылкам</em>, не оформленным активными гиперссылками, добавляет настраиваемые модификаторы <em>при Ctrl+кликах и Shift+кликах по ссылкам</em>, а также позволяет <em>сделать панель поиска независимой для каждой вкладки</em>.<span id="more-789"></span></p>
<p><strong>ВНИМАНИЕ!<br />
Эта статья была написана в 2015 году, и в современных Firefox все описываемое уже не работает.</strong></p>
<p>Функциональность:</p>
<ul>
<li>Дополнение контекстного меню страницы
<ul>
<li>Опция &#8220;Перейти по ссылке&#8221;<br />
Позволяет браузеру обработать выделенный текст как веб-адрес и попытаться перейти по нему. Например, если на странице имеется фрагмент ссылки без http:// или www, который не оформлен как гиперссылка, то для перехода по нему нужно просто выделить этот адрес и нажать на &#8220;Перейти по ссылке&#8221; в контекстном меню. Если выделенный текст совершенно не похож на ссылку &#8211; то будет открыта страница поиска данного фрагмента в текущем интернет-поисковике. Копирует функциональность Opera 12.</li>
<li>Дополнительное меню поиска<br />
Позволяет искать выделенный текст в текущем интернет-поисковике, а также выбирать другие установленные в браузере поисковики. При этом выбранный поисковик будет запомнен для данной вкладки и в следующий раз в контекстном меню поиска по умолчанию будет предложен он. Также копирует функциональность Opera 12.</li>
</ul>
<p>Это контекстное меню отображается только на выделенном фрагменте текста.</li>
<li>Каждой вкладке &#8211; своя панель поиска<br />
По умолчанию панель поиска не зависит от текущей вкладки и является общей для всего браузера. Данное расширение позволяет запоминать отдельные параметры панели поиска для каждой вкладки. Например, набрав в панель поиска слово &#8220;тест&#8221; в одной вкладке, вы можете переключиться на другую вкладку и набрать в ней в панель поиска слово &#8220;проверка&#8221;. Вернувшись обратно на первую вкладку &#8211; вы увидите, что содержимое панели поиска заменилось обратно на слово &#8220;тест&#8221;.<br />
Более того, для каждой вкладки запоминается последний использовавшийся интернет-поисковик и при переходе между вкладками переключаются и они. Так, если в одной вкладке вы запрашивали через панель поиска информацию в Google, а в другой &#8211; выбирали для поиска Яндекс, то при переключении между вкладками в одной из них для поиска останется выбран Google, а в другой &#8211; будет выбран Яндекс.<br />
&nbsp;</li>
<li>Настраиваемое поведение браузера при кликах по ссылкам с зажатыми клавишами-модификаторами Ctrl и Shift<br />
Настройки по умолчанию:
<ul>
<li>Клик &#8211; открыть ссылку в текущей вкладке;</li>
<li>Shift+клик &#8211; открыть ссылку в новой вкладке;</li>
<li>Ctrl+клик &#8211; открыть ссылку в новой фоновой вкладке.</li>
</ul>
<p>Эти модификаторы работают и на ссылках, и на кнопках, и при отправке заполненных форм, и даже при заполнении поисковых запросов в панели поиска.</li>
</ul>
<p>Начиная с версии 1.0.5 расширение GTWA также в полной мере поддерживает обновленную в Firefox 34 панель поиска. <s>Причем старый вид панели, скорее всего, больше корректно работать не будет.</s> Теперь при нажатии на иконки других поисковых систем &#8211; они будут выбраны в качестве текущего поисковика. Например, если у вас установлен по умолчанию поисковик от Яндекса, а вы набрали поисковый запрос и кликнули на иконку Google в панели поиска &#8211; то поисковик от Google станет основным для данной вкладки, и в дальнейшем запросы поиска из этой вкладки по умолчанию будут направлены в Google.</p>
<p><strong>Скачать расширение <a href="http://fs.erinome.net/tools/gtwa" target="_blank">GTWA v1.0.5a</a> можно из нашего архива.</strong></p>
<p><span style="font-size: x-small">Обратите внимание, что из-за особенностей реализации новой панели поиска в Firefox 34, где понятия &#8220;текущий поисковик&#8221; и &#8220;поисковик по умолчанию&#8221; просто приравняли (!!) друг к другу, действительный &#8220;поисковик по умолчанию&#8221; теперь хранится в настройках расширения, а не настройках браузера, и обновляется при изменении &#8220;поисковика по умолчанию&#8221; в стандартном меню настроек браузера. При этом данное меню, вообще говоря, отображает текущий поисковик для текущей вкладки, и поэтому увидеть в нем тот поисковик, который в данный момент выбран как настоящий поисковик по умолчанию &#8211; невозможно. Но он запоминается расширением. За такие неудобства можно благодарить разработчиков Firefox.</span></p>
<p><span style="font-size: x-small">Также обратите внимание, что GTWA делалось человеком, который не является профессионалом в создании расширений для Firefox, и который за свою жизнь создал только одно это расширение, и создавалось оно для личных целей, а не широкого использования. По этой причине в нем могут быть некоторые недостатки, но при должной удаче и благоприятном расположении звезд они могут быть устранены в случае обнаружения таковых.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2015/03/789/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NAPS2 &#8211; Erinome Edition</title>
		<link>https://tt.erinome.net/2015/03/734</link>
		<comments>https://tt.erinome.net/2015/03/734#comments</comments>
		<pubDate>Mon, 02 Mar 2015 09:11:17 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=734</guid>
		<description><![CDATA[Для удобного сканирования документов и сохранения результатов в многостраничные PDF-файлы существует неплохая opensource-утилита NAPS2 &#8211; Not Another PDF Scanner 2. Она умеет работать как с WIA-драйверами сканеров, так и по TWAIN, предоставляет возможности по переворачиванию и сортировке сканированных изображений перед &#8230; <a href="https://tt.erinome.net/2015/03/734">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Для удобного сканирования документов и сохранения результатов в многостраничные PDF-файлы существует неплохая opensource-утилита NAPS2 &#8211; <a href="http://sourceforge.net/projects/naps2/" target="_blank" title="sourceforge project page" style="white-space: nowrap;">Not Another PDF Scanner 2</a>.</p>
<p>Она умеет работать как с WIA-драйверами сканеров, так и по TWAIN, предоставляет возможности по переворачиванию и сортировке сканированных изображений перед их экспортом, а также поддерживает сохранение в различные графические форматы. </p>
<p>Но есть в ней и некоторые недостатки. Во-первых, это запись неверного статического значения DPI в сохраняемые файлы вне зависимости от фактического DPI сканирования &#8211; в результате чего в экспортируемых PDF-файлах оказывается указан некорректный формат страниц. Во-вторых, невозможно не заметить отвратительный перевод интерфейса на русский язык. И, наконец, местами интерфейс нельзя назвать удобным.</p>
<p>Предлагаю вниманию модифицированную версию NAPS2 EE.<span id="more-734"></span></p>
<p><u>Список внесенных изменений</u></p>
<ul>
<li>Исправлено значение DPI во всех экспортируемых файлах;</li>
<li>Добавлена возможность импортирования изображений и PDF-документов, созданных в NAPS2;</li>
<li>Добавлена возможность экспорта только выбранных изображений;</li>
<li>Добавлена возможность сортировки изображений путем перетаскивания мышью их миниатюр, к списку миниатюр добавлено контекстное меню;</li>
<li>Переработано окно предпросмотра:
<ul>
<li>Добавлена возможность листания изображений;</li>
<li>Добавлена возможность поворачивания и удаления изображений;</li>
<li>Добавлена возможность обрезки изображений;</li>
<li>Добавлена возможность изменения размеров изображений;</li>
<li>Добавлена возможность переведения цветного изображения в оттенки серого;</li>
<li>Положение окна теперь корректно запоминается при его закрытии.</li>
</ul>
</li>
<li>Зеркалирование изображений теперь действительно является зеркалированием;</li>
<li>Импорт и экспорт изображений переведен на библиотеку FreeImage;</li>
<li>Обновлена библиотека экспорта PDF-документов pdfsharp до актуальной версии;</li>
<li>Исправлена ошибка, приводящая к необоснованному увеличению объему результирующего файла при экспорте трансформированных изображений в PDF-документы;</li>
<li>Исправлены ошибки, в редких случаях приводящие к нестабильности приложения;</li>
<li>Многочисленные доработки интерфейса программы;</li>
<li>Убраны локализации на все языки кроме английского и русского, перевод на русский язык переработан и исправлен.</li>
</ul>
<p>Скачать из архива: <a href="http://fs.erinome.net/tools/naps2">NAPS2 Erinome Edition</a><br />
Стандартная Standalone-версия, не требующая установки.</p>
<p><u>История версий</u></p>
<div style="font-size: x-small;"><strong>Первый релиз &#8211; версия 2.6.3</strong></p>
<ul>
<li>Теперь экспортируемые файлы имеют верное значение PPI (поддерживаются все способы сканирования кроме &#8220;Native WIA UI&#8221;);
<li>Исправлен русскоязычный интерфейс, убраны все переводы кроме русского и английского;
<li>Обновлена версия библиотеки pdfsharp до актуальной 1.32;
<li>Для экспорта графических файлов используется библиотека FreeImage вместо встроенных средств .NET (в разработке).</ul>
<p><strong>Обновление от 20.01.2015 &#8211; версия 2.6.3-1</strong></p>
<ul>
<li>Теперь все экспортируемые файлы имеют правильное значение PPI (поддерживаются все способы сканирования, в том числе &#8220;Native WIA UI&#8221;);</li>
<li>Исправление незначительных недочетов пользовательского интерфейса;
<li>Исправление неточностей в локализации на русский язык.</li>
</ul>
<p><strong>Обновление от 24.01.2015 &#8211; версия 2.6.4</strong></p>
<ul>
<li>Добавлена возможность импорта изображений и PDF-файлов (доработанный бэкпорт из оригинальной версии 3.0b);</li>
<li>Добавлена возможность сохранять только выделенные изображения, а если в момент сохранения ни одно изображение не выделено &#8211; сохранены будут все;</li>
<li>Добавлены новые параметры в appsettings.xml:
<ul>
<li><strong>AppMode</strong> определяет режим хранения пользовательских файлов:<br />
<em>Standalone</em> = всё хранится в папке программы;<br />
<em>Normal</em> = всё хранится в папке AppData текущего пользователя.</li>
<li><strong>AddUsernameToPDF</strong> разрешает добавление имени пользователя в PDF:<br />
<em>true</em> = в поле Author в PDF будет указано имя пользователя;<br />
<em>false</em> = в поле Author в PDF будет указано &#8220;NAPS2 User&#8221;.</li>
</ul>
</li>
<li>Кнопка &#8220;Зеркально отразить&#8221; теперь действительно зеркально отражает изображения по оси X (при нажатии с зажатой клавишей Ctrl &#8211; по оси Y);</li>
<li>Исправлено несколько ошибок в коде, которые в отдельных ситуациях могли приводить к сбою программы;</li>
<li>Незначительные доработки пользовательского интерфейса.</li>
</ul>
<p><strong>Обновление от 30.01.2015 &#8211; версия 2.6.4-2</strong></p>
<ul>
<li>Переработан интерфейс при сохранении выделенных изображений во избежание ситуаций со случайным сохранением отдельных листов, когда подразумевалась необходимость сохранения их всех;</li>
<li>Исправлена ошибка при импорте некоторых PDF-файлов;</li>
<li>Незначительные доработки кода и пользовательского интерфейса.</li>
</ul>
<p><strong>Обновление от 04.02.2015 &#8211; версия 2.6.5</strong></p>
<ul>
<li>Добавлена возможность пересортировки сканированных изображений путем перетаскивания их мышью;</li>
<li>Добавлена возможность импортирования изображений путем перетаскивания их мышью из проводника.</li>
</ul>
<p><strong>Обновление от 12.02.2015 &#8211; версия 2.6.5-2</strong></p>
<ul>
<li>Импортирование изображений и первичная обработка сканированных изображений теперь производится через библиотеку FreeImage, за счет чего увеличено число поддерживаемых форматов изображений при импорте и незначительно снижен размер сохраняемых документов при экспорте в PDF;</li>
<li>Сохранение в PDF-документ изображений, над которыми проводились операции трансформации (поворот, зеркалирование), более не приводит к необоснованному увеличению размера сохраняемого файла;</li>
<li>Исправлена проблема при сохранении изображений, которая в отдельных ситуациях могла привести к невысвобождению памяти приложением;</li>
<li>Исправлена проблема при закрытии окна предпросмотра, которая в отдельных ситуациях могла привести к невысвобождению памяти приложением;</li>
<li>В меню миниатюр изображений добавлено контекстное меню с базовыми функциями;</li>
<li>Незначительные исправления пользовательского интерфейса.</li>
</ul>
<p><strong>Обновление от 20.02.2015 &#8211; версия 2.6.5-5</strong></p>
<ul>
<li>Исправлено сохранение DPI при экспорте изображений;</li>
<li>Исправлено сохранение в PDF некоторых импортированных изображений;</li>
<li>Реорганизован процесс экспорта изображений.</li>
</ul>
<p><strong>Обновление от 02.03.2015 &#8211; версия 2.6.6</strong></p>
<ul>
<li>В окне предпросмотра теперь можно листать изображения;</li>
<li>В окне предпросмотра добавлена возможность базового редактирования изображений.</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2015/03/734/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AutoIt3 &#8211; _IEFrameGetObjByName() failure after IE update</title>
		<link>https://tt.erinome.net/2014/12/740</link>
		<comments>https://tt.erinome.net/2014/12/740#comments</comments>
		<pubDate>Mon, 22 Dec 2014 11:09:01 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=740</guid>
		<description><![CDATA[Недавняя группа системных обновлений Windows привела к неработоспособности утилиты автоматизации AutoIt в контексте работы с браузером IE и сайтами, представляющими собой группу фреймов, объединенных во FRAMESET. После установки системного обновления KB3025390 вызов функции _IEFrameGetObjByName() из библиотеки IE.au3 приводит к ошибке &#8230; <a href="https://tt.erinome.net/2014/12/740">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Недавняя группа системных обновлений Windows привела к неработоспособности утилиты автоматизации AutoIt в контексте работы с браузером IE и сайтами, представляющими собой группу фреймов, объединенных во FRAMESET.<span id="more-740"></span></p>
<p>После установки системного обновления <a href="http://support.microsoft.com/kb/3025390" target="_blank">KB3025390</a> вызов функции _IEFrameGetObjByName() из библиотеки IE.au3 приводит к ошибке следующего вида:</p>
<pre class="console">"C:\autoit\Include\IE.au3" (1808) : ==> Variable must be of type "Object".:
Return SetError($_IEStatus_Success, $oTemp.GetElementsByTagName($s_TagName).length, $oTemp.GetElementsByTagName($s_TagName))
Return SetError($_IEStatus_Success, $oTemp^ ERROR
>Exit code: 1    Time: 1.645</pre>
<p>Детальное рассмотрение алгоритмов работы IE.au3 приводит к заключению о том, что обновление KB3025390 делает невозможным обращение к содержимому вложенных фреймов, несмотря на то, что они находится в одном и том же домене и ограничения кросс-доменной политики безопасности не должно применяться в данном случае. Аналогичную проблему подтверждают и в <a href="https://social.technet.microsoft.com/Forums/en-US/fda6183e-77ae-49be-9008-7b706fb5b7c6/why-is-there-no-knowledgebase-article-for-the-justreleased-ie11-update-kb3025390?forum=ieitprocurrentver" target="_blank">других источниках</a>, не связанных с программированием под AutoIt.</p>
<p>Решение проблемы простое &#8211; деинсталляция обновления KB3025390 восстанавливает работоспособность скриптов, взаимодействующих с фреймами.</p>
<p>PS: Что характерно, согласно описанию обновления KB3025390 &#8211; оно должно исправлять проблемы, возникающие после установки предыдущего кумулятивного патча IE, выпущенного парой недель ранее. И ни слова про изменение политик работы с фреймами там не указано. Вот так и всегда &#8211; исправляя одно, ломают другое.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2014/12/740/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Редактирование реестра Windows из среды восстановления</title>
		<link>https://tt.erinome.net/2014/09/695</link>
		<comments>https://tt.erinome.net/2014/09/695#comments</comments>
		<pubDate>Mon, 08 Sep 2014 10:18:18 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows 7]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=695</guid>
		<description><![CDATA[В далеком прошлом мы описывали, как можно за считанные минуты переключать жесткие диски из режима &#8220;IDE Compatible&#8221; в AHCI и обратно, не потеряв работоспособности установленной операционной системы (Windows). Но этот способ требует, чтобы операционная система была работоспособна. А иногда может &#8230; <a href="https://tt.erinome.net/2014/09/695">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>В далеком прошлом <a title="Windows 7: переключение SATA из IDE-режима в AHCI" href="http://tt.erinome.net/2013/07/597">мы описывали</a>, как можно за считанные минуты переключать жесткие диски из режима &#8220;IDE Compatible&#8221; в AHCI и обратно, не потеряв работоспособности установленной операционной системы (Windows). Но этот способ требует, чтобы операционная система была работоспособна. А иногда может случиться так, что система уже не запускается и вернуть аппаратную конфигурацию к исходному рабочему состоянию затруднительно или невозможно.<span id="more-695"></span></p>
<p>Отредактировать реестр незапускаемой системы можно разными способами:</p>
<ul>
<li>Загрузившись с установочного диска с Windows, после загрузки меню установки и выбора языка ввода можно нажать Shift+F10, откроется командная строка, из которой можно предпринять ряд действий по восстановлению уже имеющейся системы;</li>
<li>Существуют и LiveCD на базе ОС Windows &#8211; если в них не предусмотрено сторонних средств по работе с реестром другой операционной системы, можно сделать это при помощи стандартных программ при выполнении ряда команд из меню командной строки;</li>
<li>Просто из режима восстановления имеющейся операционной системы, который, как правило. работает и в тех случаях, когда сама система не может загрузиться.</li>
</ul>
<p>Остановимся чуть подробнее на режиме восстановления. Для входа в него необходимо до появления экрана загрузки Windows нажать на F8 и выбрать <strong>Устранение неполадок компьютера</strong> (&#8220;Repair your computer&#8221;) в дополнительных параметрах загрузки. Обратите внимание, что при перезапуске после неуспешной загрузки системы открывается сходное по внешнему виду меню, в котором предлагается либо попробовать загрузить систему заново, или выполнить автоматическое исправление запуска, а режим &#8220;Устранения неполадок&#8221; не отображается. На моей памяти средства автоматического исправления неполадок в Windows 7 ни разу не возымели какого-либо положительного эффекта, поэтому нужно просто перезапустить компьютер и успеть нажать F8 до того, как система предложит себя восстанавливать. После же загрузки оболочки восстановления системы будет предложен выбор средств для устранения неполадок &#8211; выбираем режим <strong>Командная строка</strong>.</p>
<p>Как только вы оказались в командной строке, дальнейшие действия просты:</p>
<ol>
<li>Сначала необходимо выяснить, какая буква диска оказалась присвоена разделу, содержащему операционную систему. Для этого, к примеру, можно перебирать имеющиеся диски командой <strong>dir</strong>: &#8220;dir c:&#8221;, &#8220;dir d:&#8221;, &#8230; Искомый диск будет содержать знакомые папки <em>Windows</em>, <em>Program Files</em>, <em>ProgramData</em> и т.п.;</li>
<li>Командой <strong>regedit</strong> можно открыть привычный графический редактор реестра &#8211; но это реестр оболочки восстановления (или LiveCD), а не системы, которую требуется восстановить!</li>
<li>Подключаем реестр установленной системы командой REG LOAD:<br />
<strong>REG LOAD &lt;точка монтирования&gt; &lt;путь к ветви реестра на диске&gt;</strong>.<br />
Например, если диск установленной системы смонтирован под буквой D:, могут быть использованы следующие команды:
<ul>
<li><strong>reg load HKLM\TempSoftware D:\Windows\System32\Config\Software</strong><br />
ветвь HKLM\Software;</li>
<li><strong>reg load HKLM\TempSystem D:\Windows\System32\Config\System</strong><br />
ветвь HKLM\System;</li>
<li><strong>reg load HKU\TempUser D:\Users\&lt;username&gt;\ntuser.dat</strong><br />
ветвь HKU\UserSID указанного пользователя</li>
</ul>
<p>Смонтированные таким образом ветви реестра установленной системы будут видны в редакторе реестра в указанных точках монтирования, которым можно задать произвольные имена.</li>
<li>После внесения в реестр необходимых изменений нужно выгрузить импортированные ветви и сохранить их на диске при помощи команды <strong>REG UNLOAD &lt;точка монтирования&gt;</strong>.
</ol>
<p>В случае, если система перестала запускаться по причине замены материнской платы и несовпадения драйверов контроллера жестких дисков, необходимо включить стандартные драйверы для IDE или AHCI. Для этого:</p>
<ol>
<li>Через командную строку загружаем ветвь реестра<br />
<strong>reg load HKLM\TempSystem D:\Windows\System32\Config\System</strong>
<li>Запускаем редактор реестра, находим ключ <em>HKLM\TempSystem\CurrentControlSet\services\msahci</em> и заменяем значение параметра <em>Start</em> на <em>0</em>. В случае IDE-диска аналогично поступаем с ключом <em>HKLM\TempSystem\CurrentControlSet\services\pciide</em>.
<li>Закрываем редактор реестра и не забываем выгрузить изменения обратно на диск<br />
<strong>reg unload HKLM\TempSystem</strong>
</ol>
<p>Теперь перезапускаем компьютер &#8211; с активированными стандартными драйверами система должна успешно загрузиться.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2014/09/695/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
