tag:blogger.com,1999:blog-39660488316131831642024-03-14T16:20:44.054+03:00АнтисклерозAxahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.comBlogger256125tag:blogger.com,1999:blog-3966048831613183164.post-1660848827025398832023-05-12T12:05:00.011+03:002023-05-12T12:29:54.232+03:00Автоматическая вентиляции в бане.<div>
<div class="separator" style="clear: both;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9CYa7pATnSteOEeuGYwI11oKqs1OsXpYv-794mFIDTx2_OCKS1s2FvMG4sHuH9yRVkAWgvZNc6UTWhJ2IbmyG7CcV8Caz_WgTjUCxozGFYvvWqouUYWmbkExnOeONSPKsgYmw3WpXYJDxty1dWNbPvHBJE6uFqHm-XDSAO0_FUQRzOJV-8MjNUfSvg/s1600/cooler.png" style="float: left; height: 120px;" vspace="5" />
<p>При постройке бани я сразу заложил воздуховоды для организации принудительной вентиляции от кухонной вытяжки, из туалета и душа.</p>
<p>Но долго не мог приступить к проектированию и сборке контроллера и установки всей системы.</p>
</div>
<div>
<p>Но тут дал себе пинка под жопу и за неделю спроектировал, собрал и установил систему вентиляции.</p>
<p>На видео завершающий этап сройки. Иван фёдорович крепит доску, а я с камерой прохожу по всей бане. В парилке своя отдельная вентиляция, а здесь я расскажу как я сделал вентиляцию в остальных помещениях</p>
<div class="separator" style="clear: both; text-align: center;">
<iframe class="BLOG_video_class" allowfullscreen="" youtube-src-id="s3W4JnjL66o" width="600" height="498" src="https://www.youtube.com/embed/s3W4JnjL66o"></iframe>
</div>
<p>Итак, что мы имеем.</div>
</div>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-49735041891556774372023-04-13T11:21:00.027+03:002023-04-21T22:02:46.721+03:00Arduino Nano. Не загружается скетч<div class="separator" style="clear: both;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZUn_dF6I1-KaEvIPCPKcAeS-QwwhHnlbqIiYEsqsCAn_ZK3bnjNxznzkabIY5-R0HpL2BbvCgGTqhOeATGSz52_m9JhJXu3cxUr-M8vKtoKsvOFSVRtpdyI9uTyAQ_w83npk--j-DVr6O2j6nHe2f4yXaSmYvT8t87ifSDzPwkqN4AyAS9-d65Mg9tw/s1280/photo_2023-04-08_20-29-46.jpg" style="float: left; height: 120px;" vspace="5" />
<p>Операционная система: Linux Mint 21 Vanessa</p>
<p>IDE: <a href="https://www.arduino.cc/en/software" target="_blank">Arduino 2.0.4</a></p>
<p>Плата: Китайская Arduino Nano</p>
<p></p>
<p>При попытке прошить скетч сообщает, что не может найти устройство</p>
Наслоилось несколько ошибок. Ниже гайд по включению.
</div>
<div>
<ol>
<li>
<p>В системе установлен пакет <a href="http://www.tiflocomp.ru/docs/brltty.php" target="_blank">brltty</a>, который мешал нормальной работе с tty сh341.<br/>
Выяснилось это по логу в dmesg.
</p>
<!-- HTML generated using hilite.me -->
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding: .2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #c65d09; font-weight: bold">$</span> dmesg | grep ch34</pre>
</div>
<p>Если последнее сообщение типа</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"> ch341 1-4.1.3:1.0: device disconnected</pre>
</div>
<p>Значит что то пошло не так.
При более детальном просмотре dmesg обнаружил, что пакет brltty конфликтует с ch341 за /dev/ttyUSB0.<br/>
Удаляем пакет brltty из системы:
</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #c65d09; font-weight: bold">$</span> sudo apt remove brltty</pre>
</div>
</li>
<li>
<p>У меня получалось запрограммировать Arduino Nano через программатор и я наивно полагал, что программирование через usb это то же самое. Ан нет. Это другой интерфейс.<br/>
Подключаем Arduino Nano к usb и смотрим как она видится в системе:
</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #c65d09; font-weight: bold">$</span> lsusb
...
Bus 001 Device 015: ID 1a86:7523 QinHeng Electronics CH340 serial converter
...</pre>
</div>
<p>У меня она подключена к <i>Bus 001</i>, как <i>Device 015</i>. Зависит от того в какой разъем usb воткнута Arduino.<br/>
Важным является <i>ID 1a86:7523</i><br/>
Нужно разрешить системе работать с этим устройством.<br/>
Для этого создаем файл <i>/etc/udev/rules.d/99-Arduino.rules</i> и прописываем в него такие правила:
</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"># Arduino Nano rule
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666″, GROUP:="dialout"
# Arduino USBASP rule
SUBSYSTEMS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE:="0666″, GROUP:="dialout"
</pre>
</div>
<p>Чтоб два раза не вставать я добавил второе правило для программатора USBasp.<br/>Для применения правил нужно дать в терминале команду:</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #c65d09; font-weight: bold">$</span> sudo udevadm control --reload-rules</pre>
</div>
</li>
<li>
<p> В предыдущем пункте я указал группу <a href="https://losst.pro/gruppy-polzovatelej-linux" target="_blank">dialout</a>.<br/>
Эта группа создана для доступа к последовательным портам. Нужно проверить что вы включены в эту группу.<br/> Можно просто дать команду:
</p>
<!-- HTML generated using hilite.me -->
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #c65d09; font-weight: bold">$</span> usermod -aG dialout <span style="color: #996633">$USER</span></pre>
</div>
</li>
<li>
<p>Проверяем результат выполения предыдущих пунктов.<br/> Для этого открываем терминал и вводим команду:</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #c65d09; font-weight: bold">$</span> tail -f /var/log/syslog | grep ch34</pre>
</div>
<p>Подключаем нашу Arduino к usb. Должно появиться что то вроде этого</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%">Apr 11 14:00:19 x-270 kernel: [ 2911.934831] ch341 1-4.1.3:1.0: ch341-uart converter detected
Apr 11 14:00:19 x-270 kernel: [ 2911.936002] usb 1-4.1.3: ch341-uart converter now attached to ttyUSB0</pre>
</div>
<p>Отключаем от usb:</p>
<div style="background: #fffaf0; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em; margin: 0 2em 0 1em;">
<pre style="margin: 0; line-height: 125%">Apr 11 14:00:17 x-270 kernel: [ 2909.300300] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
Apr 11 14:00:17 x-270 kernel: [ 2909.303921] ch341 1-4.1.3:1.0: device disconnected</pre>
</div>
<p>Отлично. Наша Arduino подключается к ttyUSB0</p>
</li>
<li>
<p>Все. Система настроена. Теперь выбираем в IDE следующие параметры<br/>
Board: Arduino Nano<br/>
Port: /dev/ttyUSB0<br/>
Processor: ATMega328P (Old Bootloader)<br/>
Programmer: - можно выбрать любой. От этого в данном случае ничего не зависит<br/>
<br/>
Выбираем пункт меню Tools -> Get Board Info<br/>
В окне должны увидеть параметры устройства, которые мы определили в П.2:
</p>
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Piz2lW4SrV0avpGJOkIDvCvIeFZlxED5ROjnPqhBwRdhdvIM2rhjho3UrnjYZnYvk3EKD6HQaNUN5UzGMV1tdXxb_j0soEYSWjEL1-jxbSY1U07jl2g0UWCQui9b30YDeWCZCljrkNLmYO16ya7R2zUcH8x2ymCbacBDe-MSNr3CsC9TYteVRMpy1A/s1600/Selection_107.png" style="float: center;" vspace="5" />
</li>
</ol>
<p>После выполнения указанных действий Arduino Nano должна шиться через свой USB разъем.</p>
<h2>Все равно ничего не работает.</h2>
<p>Если после указанных действий не получается ничего записать в Arduino, то попробуйте следующее.</p>
<ol>
<li>
<p>Если в каталоге <i>/etc/udev/rules.d/</i> есть другие файлы правил. Возможно они конфликтуют. Попробуйте временно переместить их в другой каталог. Не забудьте дать команду <i>sudo udevadm control --reload-rules</i></p>
</li>
<li><p>В Arduino стерт загрузчик.<br/>Его нужно записать с помощью программатора.</p></li>
</ol>
</div>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-53836997417519532192019-05-17T17:55:00.003+03:002023-04-17T04:53:36.703+03:00Осцилограф Siglent хакнули.<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVXQSGC1ivO7JQ9y3Hq0nlMNFO4XhwiV6HSSBt1renveEbscAiajtNBtFjSfABuy8mjHtDb7xKBOh1mRmw8g9kWryzhDJnOY17kfNFmoehlj4PxIFMcLMm8R-0_2fUsPTfnjwjGVErN743FYdPuKnNrgzRhhUbNBR_fdPQ3yLg1zJgj-uLUQXoGDK4ag/s1600/hacker02.png"" style="float: left; height: 120px; width: 120px;" vspace="5" /></div>
<p>В связи с тем, что сильно загружен на работе и нет особого времени на моё любимое хобби, пропустил момент, что осциллограф Siglent SDS2000X хакнули. Исправляю этот недочет.</p>
<p>Вот <a href="https://www.eevblog.com/forum/testgear/siglent-sds2000x-hack/msg1848566/#msg1848566">ссылка на оригинальный пост с модифицированной прошивкой</a>, которая расширяет полосу пропускания любого прибора 2000-ной серии до 3-х сот мегагерц.</p>
<p>Я еще не проверил этот хак. </p>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-37993076782009588582019-03-24T13:16:00.007+03:002023-04-17T05:00:11.385+03:00Интеграция Remote TransGUI c Linux Mint
<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhroeEA6F8AlkwVSfv2-An_U176rv4rOeiCO5HbkQorMwE3TQ577myWi66wZt_IOJQ257iOySp_j3xeuabcMg-QEMLY1UcnYwKduI_Zu-yEC7gRS8UDQoDFd6RsU-JFGAM2FEoj3tZt5yX62CYCvhFReNmvV_BCP1x7Tjok4sFRcYTj1tSv2c8AjB27aw/s1600/Transmission.png" style="float: left; height: 120px; width: 120px;" vspace="5" />
</div>
<!--
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiYgrdG8pfjpn7lr5k9ypi0jhboasWC5NBA5JlIr5x-zSL468zuz2lFYus8CuEcEIA9TFKI1gGgpQDDEHAb2f079Lt-rjUA6g2ibjg6eOrSUW67Qfa6RGGkK5_m4qYCP_ooZ8BI5FDePKB/s1600/transmission.png" style="float: left; height: 120px; width: 120px;" vspace="5" /></div>
-->
Давно хотел поправить Transmission remote GUI на предмет интеграции с системой всплывающих сообщений Linux</br>
</br>
Дело в том, что в Transmission remote GUI используется свой встроенный класс для показа всплывающих сообщений, поэтому он выглядит неродным для всех линуксов.</br>
</br>
Как то раз делал такой patch, но не сохранил его. И очередное обновление снесло его нахрен.</br>
</br>
Вот решил задокументировать. Может еще кому пригодится. Да к тому же оказывается есть форк, который активно так пилится<a href="https://github.com/transmission-remote-gui/transgui">Transmission remote GUI 5.16</a></br>
</br>
Так выглядит оригинальное сообщение о завершении закачки torrent-а.</br>
<br />
<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFmrcVpiH4YpO4oFg-zUWYM7480GP0u2R4yAg4ftXRDO2FYoc-o77mIKIly7VBbyrENnQVDl_eHOv6Ti81HbYoB8khlNpu6hcHTtCp2CpDkTTFLHaGqW_Wd8G49RnaH1BoJxYucLOrIQ65aoCbF1mKfsZugq5aHaiR5DagoRcrZxZhH6GFNVmZBPveOw/s1600/Workspace%201_005.png" style="float: center;" vspace="5" />
</div>
<div class="separator" style="clear: both; text-align: left;">
Что получится после модификации.
</div>
<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWIi-uxgzwrwvzkt0F56IPAhxvHDTsPtTqsVg1qNB_Z3_7eAbhw5LQYYSXIFl5fN4sjvoHd8ESJy_dwz_wPkBG8iZ_psh78bFC0Jlvfyrex-fJQ26QAQf2Be8THqP85AaUF1DFEHJQmqDAJuWkblf-AfOHdmMBld-3h7fH2JHv4tWC2g5wqoarqVxoRw/s1600/Workspace%201_001.png" style="float: center;" vspace="5" />
</div>
<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbx4yXvkbvbGK6yAhmf9I8YMlAsFXF6RKbMVoyl6EPUaHXIj5Zl8WN1kUTc_pp3eN020mfiqAnX_cOHZD1TDxllOnOyw48RqWcOSRxTDrEuo6ITqhcc79Y8dvj8We4VLvAPXzgaiPSvoqeQckquBfStrh9qkKi7kZvYQPtFnfnacrGF2dV5LEVp8vaIQ/s1600/Workspace%201_004.png" style="float: center;" vspace="5" />
</div>
<div class="separator" style="clear: both; text-align: left;">
Для интергации нужно внести мимнимум изменений в файл main.pas
</div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #f0f3f3; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="background-color: #ffcccc; border: 1px solid #CC0000;">--- main.pas.org 2019-03-24 12:04:25.171065996 +0300</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+++ main.pas 2019-03-24 12:14:30.712525851 +0300</span>
<span style="color: #003300; font-weight: bold;">@@ -2875,12 +2875,23 @@</span>
end;
procedure TMainForm.DownloadFinished(const TorrentName: string);
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+Var</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+ RunProgram: TProcess;</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+ message: String;</span>
begin
{$ifndef CPUARM}
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+{$ifdef linux}</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+ message:=Format(sFinishedDownload, [TorrentName]);</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+ RunProgram := TProcess.Create(nil);</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+ RunProgram.CommandLine := Concat('/usr/bin/notify-send',' "', message, '" ', ' -i "/usr/share/icons/hicolor/256x256/apps/transmission.png"');</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+ RunProgram.Execute;</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+ RunProgram.Free;</span>
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+{$else}</span>
if not TrayIcon.Visible or not Ini.ReadBool('Interface', 'TrayNotify', True) then exit;
TrayIcon.BalloonHint:=Format(sFinishedDownload, [TorrentName]);
TrayIcon.BalloonTitle:=sDownloadComplete;
TrayIcon.ShowBalloonHint;
<span style="background-color: #ccffcc; border: 1px solid #00CC00;">+{$endif linux}</span>
{$endif CPUARM}
end;
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
После внесения изменений собрать пакет и получить исполняемый файл.
Если собирать лень, то можно скачать <a href="https://drive.google.com/open?id=1EVPM05bntYjzIJIlk7uRIMdtlwDjKAYo">appimage</a> и положить его в каталог <b>/usr/bin/</b> заменив transgui предыдущей версии.</br>
Как указано выше, я сейчас пользую Linux Mint. Но все это должно работать без перекомпиляции во всех линуксах, в которых используется команда <b>notify-send</b>.</br>
И на закуску последняя версия <a href="https://drive.google.com/open?id=15FDzRZLIUFwe7Hlv5ASXm3MKMnw40Zva">Transmission 2.94 для Thecus N4800Eco</a></br>
На этом все.</br>
Как найду время, то напишу пост про настройку роутера с <a href="https://dd-wrt.com/">ddWrt</a> для работы с <a href="https://nordvpn.com/">NordVPN</a>.
</div>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-14091274074526750222018-02-23T07:43:00.000+03:002018-02-23T11:23:01.309+03:00Notify-OSD от Sukochev Roman (Leolik)<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRp5zNaWb9ii_RkB9zOhvVJDNXSS8dCYMd4tr4F4hyphenhyphenVjxFnZ4UkRBBtJNFQ77fQCULuBEdENfa4pZk0ytt9myAuGIorQu0FsxVmYYAn1llH3tg5wzQezwOy0xSg5N-Y8KLUgOb_zEmMaDC/s1600/tux-master.png" style="float: left; height: 120px; width: 120px;" vspace="5" /></div>
<p style="margin: 0; line-height: 125%; font-size:80%; font-style:italic">Роман Сукочев удачно модифицировал pop-up сообщения Notify-OSD, используемые в дистрибутивах Ubuntu и Linux Mint.</br>
Но с 13-го года он свой блог забросил.</br>
А сейчас уже 18-й.</br>
Скопирую его пост сюда, на всякий случай.</p></br>
</br>
</br>
<h3>Расширенная настройка Notify-OSD</h3>
</br>
Обновил модифицированную версию notify-osd для Ubuntu 12.04.</br>
В текущей версии, исправил отображение всплывающего сообщения в правом нижнем углу и добавил в .notify-osd опцию, использовать ли новую "фишку" убунтовцев или нет, а именно: фон всплывающих сообщений использует наиболее часто повторяющийся цвет фоновой картинки рабочего стола.</br>
</br>
Так как, многие уже теряются во всех моих предыдущих постах, посвященных патчу для Notify-OSD, я решил собрать всю информацию в этом посте и в дальнейшем обновлять именно его.</br>
<h4>Установка модифицированного notify-osd</h4>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%; font-size:130%">sudo add-apt-repository ppa:leolik/leolik
sudo apt-get update
sudo apt-get install notify-osd
</pre></div>
<h4>Позиция вывода сообщений на экране</h4>
Смена позиции вывода сообщения на экране:</br>
</br>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%; font-size:130%">gsettings <span style="color: #007020">set </span>com.canonical.notify-osd gravity <span style="color: #333333">[</span>number<span style="color: #333333">]</span>
</pre></div>
где [number]:</br>
1 - правый верхний угол</br>
2 - справа посредине экрана</br>
3 - нижний правый угол</br>
4 - нижний левый угол</br>
5 - слева посредине экрана</br>
6 - верхний левый угол</br>
<h4>Настройка notify-osd</h4>
1. Создаем у себе в домашней папке файл '.notify-osd'</br>
</br>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%; font-size:130%">nano ~/.notify-osd
</pre></div>
и добавляем туда, например, такие строки:</br>
</br>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%; font-size:130%">slot-allocation <span style="color: #333333">=</span> dynamic
bubble-expire-timeout <span style="color: #333333">=</span> 10sec
bubble-vertical-gap <span style="color: #333333">=</span> 5px
bubble-horizontal-gap <span style="color: #333333">=</span> 5px
bubble-corner-radius <span style="color: #333333">=</span> 37,5%
bubble-icon-size <span style="color: #333333">=</span> 30px
bubble-gauge-size <span style="color: #333333">=</span> 6px
bubble-width <span style="color: #333333">=</span> 240px
bubble-background-color <span style="color: #333333">=</span> 131313
bubble-background-opacity <span style="color: #333333">=</span> 90%
text-margin-size <span style="color: #333333">=</span> 10px
text-title-size <span style="color: #333333">=</span> 100%
text-title-weight <span style="color: #333333">=</span> bold
text-title-color <span style="color: #333333">=</span> ffffff
text-title-opacity <span style="color: #333333">=</span> 100%
text-body-size <span style="color: #333333">=</span> 90%
text-body-weight <span style="color: #333333">=</span> normal
text-body-color <span style="color: #333333">=</span> eaeaea
text-body-opacity <span style="color: #333333">=</span> 100%
text-shadow-opacity <span style="color: #333333">=</span> 100%
bubble-prevent-fade <span style="color: #333333">=</span> 0
bubble-close-on-click <span style="color: #333333">=</span> 1
bubble-as-desktop-bg <span style="color: #333333">=</span> 0
</pre></div>
</br>
2. А теперь меняем значения по своему усмотрению. Ниже описано подробное описание каждого параметра:</br>
</br>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>slot-allocation</i></b> - система вывода сообщений. Значения: dynamic - система вывода по-умолчанию в 9.04, fixed - система вывода по-умолчанию с версии 9.10.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-expire-timeout</i></b> - время отображения сообщения. В секундах (от 0 до 10сек).</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-vertical-gap</i></b> - вертикальный отступ между всплывающими сообщениями. В пикселях.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-horizontal-gap</i></b> - горизонтальный отступ между сообщением и правым краем экрана. В пикселях.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-corner-radius</i></b> - закругление углов у сообщения. В процентах. Нормальные значения между 0% и 55%. Но от изменения закругления меняется тень от сообщения. К примеру при 0% - не будет закругления, но не будет и тени, а если больше 55% ставить, то закругление будет криво отображаться и тень будет просто зашкаливать.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-icon-size</i></b> - размер иконок в сообщениях. В пикселях, сразу и по высоте, и по ширине.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-gauge-size</i></b> - высота шкалы громкости, яркости и т.п. В пикселях. Значение от 5 до 10. Если меньше или больше, то шкала пропадает.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-width</i></b> - ширина сообщений. В пикселях.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-background-color</i></b> - цвет фона сообщений. Цвет ставится, как в стилях в html-верстке.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-background-opacity</i></b> - прозрачность фона сообщений. В процентах. Значение от 0% до 100%.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-margin-size</i></b> - отступ от текста до границ всплывающего сообщения. В пикселях.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-title-size</i></b> - размер шрифта заголовка сообщения. В процентах от значения параметра 'Система'->'Параметры'->'Внешний вид'->'Шрифты'->'Шрифт приложения'. Тоесть, если у вас шрифт приложения стоит 8px, то 8px = 100%. Увеличение процента даст больший размер шрифта, уменьшение - меньший размер шрифта. Это действительно и для параметра text-body-size, что описан ниже.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-title-weight</i></b> - толщина начертания шрифта заголовка. Значения: bold - жирный, normal - нормальный, light - тонкий.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-title-color</i></b> - цвет шрифта заголовка. Цвет ставится, как в стилях в html-верстке.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-title-opacity</i></b> - прозрачность шрифта заголовка. В процентах. Значение от 0% до 100%.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-body-size</i></b> - размер шрифта заголовка основного текста. В процентах от значения параметра 'Система'->'Параметры'->'Внешний вид'->'Шрифты'->'Шрифт приложения'.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-body-weight</i></b> - толщина начертания шрифта основного текста. Значения: bold - жирный, normal - нормальный, light - тонкий.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-body-color</i></b> - цвет шрифта основного текста. Цвет ставится, как в стилях в html-верстке.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-body-opacity</i></b> - прозрачность шрифта основного текста. В процентах. Значение от 0% до 100%.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>text-shadow-opacity</i></b> - прозрачность тени от текста. В процентах. Значение от 0% до 100%. Цвет тени к сожалению не меняется :(</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-prevent-fade</i></b> - вкл/выкл (1/0) размытие всплывающего сообщения при наведении на него мышкой.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-close-on-click</i></b> - вкл/выкл (1/0) закрытие всплывающего сообщения при клике на нем мышкой.</p>
<p style="margin: 0.5em; line-height: 120%; font-size:90%"><b><i>bubble-as-desktop-bg</i></b> - вкл/выкл (1/0). Для цвета фона всплывающего сообщения, используется цвет Dash, для которого используется наиболее часто повторяющийся цвет фоновой картинки рабочего стола.</p>
</br>
3.Перезапускаем notify-osd:</br>
</br>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%; font-size:130%">pkill notify-osd
</pre></div>
</br>
4. Ну вот и все, теперь вы можете менять оформление всплывающих сообщений под тему своего рабочего окружения.</br>
<h4>Несколько мониторов</h4>
Это стандартная опция notify-osd, но привожу для общего сведения:</br>
multihead_mode - параметр вкл/откл отображение сообщений на том мониторе, который в данный момент активен.</br>
</br>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%; font-size:130%">gsettings <span style="color: #007020">set </span>com.canonical.notify-osd multihead-mode focus-follow
</pre></div>
Для выключения параметра, используйте любое другое значение, отличное от focus-follow</br>
</br>
PPA страница на launchpad: <a href="https://launchpad.net/~leolik/+archive/leolik">https://launchpad.net/~leolik/+archive/leolik</a></br>
Ссылка на оригинальную статью: <a href="http://leolik.blogspot.ru/2012/06/notify-osd.html">http://leolik.blogspot.ru/2012/06/notify-osd.html</a></br>
Методические рекомендации по разработке механизма уведомлений: <a href="https://wiki.ubuntu.com/NotificationDevelopmentGuidelines">https://wiki.ubuntu.com/NotificationDevelopmentGuidelines</a></br>
NotifyOSD Ubuntu Wiki: <a href="https://wiki.ubuntu.com/NotifyOSD#Icon">https://wiki.ubuntu.com/NotifyOSD#Icon</a></br>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-55271255659939435132018-01-18T15:43:00.001+03:002018-01-18T17:54:23.715+03:00Firefox: отключение всплывающих уведомлений <div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRp5zNaWb9ii_RkB9zOhvVJDNXSS8dCYMd4tr4F4hyphenhyphenVjxFnZ4UkRBBtJNFQ77fQCULuBEdENfa4pZk0ytt9myAuGIorQu0FsxVmYYAn1llH3tg5wzQezwOy0xSg5N-Y8KLUgOb_zEmMaDC/s1600/tux-master.png" style="float: left; height: 120px; width: 120px;" vspace="5" /></div>
Вышла новая версия Firefox. У меня сейчас стоит 57.0.4 (64-bit). Все очень здорово. Но просто достали всплывающие окна предлагающие то включить уведомления, то сохранить пароли.<br/>
<div class="separator" style="clear: both; text-align: left;"><br/>Я бы тому релизеру, кто оставил эти фичи по умолчанию яйца оторвал бы.<br/>
К счастью все это можно легко поправить.<br/></div>
<br/>
<div class="separator" style="clear: both; text-align: left;"><b>Отключение push уведомлений</b></div>
<br/>
Для этого в адресной строке <i>firefox</i> вводим<br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">about:config</pre></div>
<br/>
После подтверждаем, что мы в своем уме и типа все понимаем<br/>
<br/>
<div class="separator" style="clear: both; text-align: center;"><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4TEHhCauI4uOfJi28ry9ZUzvuhyVUHv4CIu8ze_2_ghnz5j60ouW7g_-i4vz58hRRXYEUr8iSFf41luy4_L1-wTaHU26T4Cw2Xec0g0ouajboOtpDdDJDq2jb0eAzSpFQIpIhbEktFqfE/s1600/Selection_003.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4TEHhCauI4uOfJi28ry9ZUzvuhyVUHv4CIu8ze_2_ghnz5j60ouW7g_-i4vz58hRRXYEUr8iSFf41luy4_L1-wTaHU26T4Cw2Xec0g0ouajboOtpDdDJDq2jb0eAzSpFQIpIhbEktFqfE/s320/Selection_003.jpg" width="320" height="121" data-original-width="910" data-original-height="343" /></a></div>
<br/>
<div class="separator" style="clear: both; text-align: left;">После чего в строке <i>search</i> вводим поочереди</div>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><i><b>dom.push.enabled</b></i>
<i><b>dom.webnotifications.enabled</b></i></pre></div>
<br/>
И устанавливаем значения этих переменных в <i>false</i><br/>
<br/>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibqCYwWS07KQFVWChtBNEYs7H0-lkS5ytYD9hUtZK5g5u6QqD6um3aERMt_OqOeQnebFv9VUtpB6O8wVcq2kxGU2m9pkeXFGaJpBYIDnp_4Q4VPlsQ7WfKYIBZkxMXxtKEBkQqKsCB2UPX/s1600/Selection_005.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibqCYwWS07KQFVWChtBNEYs7H0-lkS5ytYD9hUtZK5g5u6QqD6um3aERMt_OqOeQnebFv9VUtpB6O8wVcq2kxGU2m9pkeXFGaJpBYIDnp_4Q4VPlsQ7WfKYIBZkxMXxtKEBkQqKsCB2UPX/s320/Selection_005.jpg" width="320" height="63" data-original-width="964" data-original-height="190" /></a><br/><br/>
<br/>
<br/>
<br/>
<b>Отключение запоминания паролей</b><br/>
<br/>
Это еще проще.<br/>
Выбираем из меню настроек пункт <i>Preferences</i><br/>
<br/>
<div class="separator" style="clear: both; text-align: center;"><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNFiB1hgFznJlbRINO5kvR0evcY25dvlcnZLtFuTKKs9rUH1zvtilVX2aeeG-vIl2d_Lf_d6A5Uns3376g1bGI69A8o5anFWc2frXaaEu5uwRMaTy0F1WfbebfMECKdciy7sywdPnudhj/s1600/Google+-+Mozilla+Firefox_006.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNFiB1hgFznJlbRINO5kvR0evcY25dvlcnZLtFuTKKs9rUH1zvtilVX2aeeG-vIl2d_Lf_d6A5Uns3376g1bGI69A8o5anFWc2frXaaEu5uwRMaTy0F1WfbebfMECKdciy7sywdPnudhj/s320/Google+-+Mozilla+Firefox_006.jpg" width="320" height="242" data-original-width="1343" data-original-height="1017" /></a></div>
<div class="separator" style="clear: both; text-align: left;">Далее щелкаем на пункте меню <i>Privacy & Security</i> и мнимаем галку с пункта <i>Remember logins and passwords for websites</i></div>
<div class="separator" style="clear: both; text-align: center;"><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQjrb8fMl1J-h-JqqDF29H1XYbX-b6Iwj1wrkfd0QzJ8VYDhGL3LaTbtzy-fccqtwH6QidQdp9gumebpk95UoCOrs6uLQbGGJbUNr9tkF3Gqos-H2qn0qU-dqP5q6i-R8keHuhph9TPxKe/s1600/Selection_007.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQjrb8fMl1J-h-JqqDF29H1XYbX-b6Iwj1wrkfd0QzJ8VYDhGL3LaTbtzy-fccqtwH6QidQdp9gumebpk95UoCOrs6uLQbGGJbUNr9tkF3Gqos-H2qn0qU-dqP5q6i-R8keHuhph9TPxKe/s320/Selection_007.jpg" width="320" height="124" data-original-width="1077" data-original-height="419" /></a></div>Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-41434346053696863172017-09-28T14:54:00.001+03:002017-09-28T15:17:37.676+03:00Назначение shortcut для выключения linux<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRp5zNaWb9ii_RkB9zOhvVJDNXSS8dCYMd4tr4F4hyphenhyphenVjxFnZ4UkRBBtJNFQ77fQCULuBEdENfa4pZk0ytt9myAuGIorQu0FsxVmYYAn1llH3tg5wzQezwOy0xSg5N-Y8KLUgOb_zEmMaDC/s1600/tux-master.png" style="float: left; height: 120px; width: 120px;" vspace="5" /></div>
В Ubuntu не предусмотрена комбинация клавиш для быстрого выключения.<br/> Можно мышкой тыкать или с помощью <b><Alt-F10></b>-><b><Left></b>-><b><Up></b>-><b><Enter></b><br/>
<br/>
Но все можно сделать намного красивей, можно назначить комбинацию клавиш, которая выключит компьютер.<br/>
<br/>
<br/>
Для этого нужно поставить пакет <a href="https://www.freedesktop.org/wiki/Software/ConsoleKit/">ConsoleKit</a>. <br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">sudo apt-get install consolekit
</pre></div>
<br/>
После завершения установки открыть окно назначения shortcuts. <br/>
Нажав на <b>[+]</b> добавить новый shortcut.<br/>
<br/>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbx6GsngtPHvpX_jyP9cchpg00sFp6ufYIyNRNO7JwI3Gw-CEd8GEvykN1c4KpNStsJn8z3uIdYZmTi3dJFaqdIOZy4WUJVveHvazUuNSx15Kbhi6vmsNHAVgXNx-QxvwdBrCoNgRMmgLj/s1600/Selection_157.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbx6GsngtPHvpX_jyP9cchpg00sFp6ufYIyNRNO7JwI3Gw-CEd8GEvykN1c4KpNStsJn8z3uIdYZmTi3dJFaqdIOZy4WUJVveHvazUuNSx15Kbhi6vmsNHAVgXNx-QxvwdBrCoNgRMmgLj/s320/Selection_157.png" width="320" height="188" data-original-width="865" data-original-height="507" /></a><br/>
<br/>
Написать в поле <b>Name</b> любую метку, например Shutdown, а в поле <b>Command</b> ввести следующую команду:<br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">/usr/bin/dbus-send --system --print-reply --dest<span style="color: #333333">=</span><span style="background-color: #fff0f0">"org.freedesktop.ConsoleKit"</span> /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
</pre></div>
Осталось присвоить комбинацию клавиш. Я назначил <b><Super></b>+<b><Q></b>Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com3tag:blogger.com,1999:blog-3966048831613183164.post-89915958731005348972017-09-22T06:32:00.001+03:002018-01-22T19:49:48.076+03:00Мой RVi-R04LA White хакнули.У меня вместо глазка установлен видеорегистратор. Очень удобно. Не нужно прижиматься к глазку двери. На мониторе видно кто пришел и все такое.<br />
<br />
В качестве видеорегистратора я использую <a href="http://rvi-cctv.ru/catalog/analogovoe_videonablyudenie_1/tsifrovoy_videoregistrator_rvi_r04la_white/">RVi-R04LA White</a>. Это клон китайского регистратора, выпущенный под торговой маркой нашей российской компании RVi. Специалисты, судя по всему, сделали перевод интерфейса на русский язык, продали ее и подобные китайские клоны и написали про себя <a href="http://rvi-cctv.ru/about/">мегапафосные строки про то</a>, как они формируют уверенность и глубоко понимают потребности.<br />
У этих господ из RVi есть <a href="http://rvi-cctv.ru/forum/">форум</a>.<br />
<br />
DVR я установил в 2014 году и с тех пор она исправно трудилась.<br />
<br />
Напрягало, что компания не давала пароль root. <br />
Да и черт с ним, думал я. Не такое уж важное устройство, чтоб по этому поводу сильно переживать.<br />
<br />
Ну и вот, накануне случилось то, что должно было случиться: эту штуку хакнули. Я просыпаюсь, а у меня черные экраны и подписи к ним: HACKED.<br />
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz8wTUMMs5OFlxmyK7feHbrJ9YzO81Wt-274PJKQhhW8fzA0mE_Duuj_6SQUMBEjt0xeONv4mWE3jPGlqrX-h3Z263oa8VncOas6FJxxL0087J3FaiGPHo7qcO8E3a83Iph9FceH8Cc7_v/s1600/02-IMG_20170921_105829.jpg" imageanchor="1"><img border="0" data-original-height="1276" data-original-width="1600" height="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz8wTUMMs5OFlxmyK7feHbrJ9YzO81Wt-274PJKQhhW8fzA0mE_Duuj_6SQUMBEjt0xeONv4mWE3jPGlqrX-h3Z263oa8VncOas6FJxxL0087J3FaiGPHo7qcO8E3a83Iph9FceH8Cc7_v/s400/02-IMG_20170921_105829.jpg" width="400" /> </a><br />
<br />
Прикольно так, ты ни сном ни духом, а твои камеры смотрит китайский брат. Хорошо, что мои то на лестничную клетку выведены, а те у кого камеры установлены в приватной зоне? Это как? Господа из RVi, расскажите мне про вашу миссию.<br />
<br />
Ну да ладно, смотрим что случилось. Заходим в информацию о сети. Замечательно. Мой DVR смотрит не на мой рацтер а на какой то левй адрес в сети. По второму экрану видим, что адрес не мертвый, а он забирает трафк от моего DVI.<br />
<br />
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs1s98rmR5PPwCKNY4caaBtLUXYZS2i1frLLfmkx2JAZWCZx74PePR8gFRgxbtEy4Pvjrst7L4BhbMRJ_d0jQ8FjqWGMVWn5VXjOTovfZnEVXoClGFM52s7rSB-E_SrvuxhOGacqWWOM-2/s1600/03-IMG_20170921_105536.jpg" imageanchor="1"><img border="0" data-original-height="1600" data-original-width="1516" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs1s98rmR5PPwCKNY4caaBtLUXYZS2i1frLLfmkx2JAZWCZx74PePR8gFRgxbtEy4Pvjrst7L4BhbMRJ_d0jQ8FjqWGMVWn5VXjOTovfZnEVXoClGFM52s7rSB-E_SrvuxhOGacqWWOM-2/s400/03-IMG_20170921_105536.jpg" width="379" /></a>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicvFOj5_agu00hLX8d39XQ07rnFzpN0NIBdfz0mUd_0ZVwO2H_Y5zx08SgKNGX9DoRvuHj3lY3mSpV5adIROWjZjApdN37KBmnwMo2-rbFkpM6hO3e0g45QrSXWI9mkl6DS9YpouJH6kfI/s1600/04-IMG_20170921_110116.jpg" imageanchor="1"><img border="0" data-original-height="1600" data-original-width="1442" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicvFOj5_agu00hLX8d39XQ07rnFzpN0NIBdfz0mUd_0ZVwO2H_Y5zx08SgKNGX9DoRvuHj3lY3mSpV5adIROWjZjApdN37KBmnwMo2-rbFkpM6hO3e0g45QrSXWI9mkl6DS9YpouJH6kfI/s400/04-IMG_20170921_110116.jpg" width="361" /></a><br />
<br />
Захожу в настройки сети. Да. Все в порядке. Меня перенастроили.<br />
<br />
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidImsQrIBgpFIr4lxD5IaUPiO_zttkqiohJu5LI95brzzotfm9c8Ny0TuEMixU_8XtqAE9csBC4q_9VA9VIlU0HsStJ7_qlUlzc_yeN3hSPtFYvm-9hylxdAUUY83GsEhafaL6FBJ5RhE_/s1600/08-IMG_20170921_105930.jpg" imageanchor="1"><img border="0" data-original-height="1600" data-original-width="1501" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidImsQrIBgpFIr4lxD5IaUPiO_zttkqiohJu5LI95brzzotfm9c8Ny0TuEMixU_8XtqAE9csBC4q_9VA9VIlU0HsStJ7_qlUlzc_yeN3hSPtFYvm-9hylxdAUUY83GsEhafaL6FBJ5RhE_/s400/08-IMG_20170921_105930.jpg" width="375" /></a><br />
<br />
Идем в форум RVi. Там <a href="http://rvi-cctv.ru/forum/forum9/">многочисленные стенания и мольбы о помощи</a> и сообщения от администраторов, что компания работает над этой проблемой.<br />
Ага. Они оставили бэкдор для себя. И через этот бэкдор (или через еще один) китайцы <strike>их</strike> меня наказали.<br />
<br />
Смотрим лог устройства. Видно, что к моему устройству подключился некто с адреса 195.209.58.2. Судя по всему удаленно перепрошил и перезагрузил DVR.<br />
Затем, в 10 часов зашли с адресов 46.249.21.95, 109.197.230.38. Добавили своего пользователя и уже потом изменили конфигурацию сети.<br />
Из сообщений на форуме видно, что смена пароля спасает примерно часа на три.<br />
<br />
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv4pd7RJ5qwPDLxJYCsZO5bZrn_vMvlisqhz6bXiVxPnKTpzax0BsSrt2aRDA8TWzbmpvgFasLoowX5Tiekzj4QVctVWGhPP9ajajMzSiVIg5NNs-uHR7goMdjxYd_5kBVsFWMK3hWsQzG/s1600/05-IMG_20170921_105319.jpg" imageanchor="1"><img border="0" data-original-height="1600" data-original-width="1483" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv4pd7RJ5qwPDLxJYCsZO5bZrn_vMvlisqhz6bXiVxPnKTpzax0BsSrt2aRDA8TWzbmpvgFasLoowX5Tiekzj4QVctVWGhPP9ajajMzSiVIg5NNs-uHR7goMdjxYd_5kBVsFWMK3hWsQzG/s400/05-IMG_20170921_105319.jpg" width="371" /></a>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgox7BCWHBVlCVi4ieW3Ula3Dfznp-iIwynu7g77WVYkVm2Rm_6ING_O3Da7OkTt8vOFycFqCVYkStz4LyCB3Bt1JeIKwRlWliSWk6jZ3xXQ_bR7F9EO8SjZ7noo15Jt84GgugBWsvtcGwe/s1600/06-IMG_20170921_105300.jpg" imageanchor="1"><img border="0" data-original-height="1600" data-original-width="1515" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgox7BCWHBVlCVi4ieW3Ula3Dfznp-iIwynu7g77WVYkVm2Rm_6ING_O3Da7OkTt8vOFycFqCVYkStz4LyCB3Bt1JeIKwRlWliSWk6jZ3xXQ_bR7F9EO8SjZ7noo15Jt84GgugBWsvtcGwe/s400/06-IMG_20170921_105300.jpg" width="379" /></a><br />
<br />
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtHPkCCXOYg7BFccM12bpJPyIA40igSs-qUwzmgOhQOEH6l6EOyczizH3MrxPK1x9wsJR41k3YedJ-fw_jPgHVdmjBSHxxNV35pfDqyPc66CsL8nrkVNJIo7cBf5W1H8cTXrCxwuq4FrXb/s1600/07-IMG_20170921_105244.jpg" imageanchor="1"><img border="0" data-original-height="1600" data-original-width="1507" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtHPkCCXOYg7BFccM12bpJPyIA40igSs-qUwzmgOhQOEH6l6EOyczizH3MrxPK1x9wsJR41k3YedJ-fw_jPgHVdmjBSHxxNV35pfDqyPc66CsL8nrkVNJIo7cBf5W1H8cTXrCxwuq4FrXb/s400/07-IMG_20170921_105244.jpg" width="377" /></a><br />
<br />
Какие отсюда выводы?<br />
Да вывод один. Известен давно. Проприетарный софт всю твою информацию передаст кому надо, либо хитрожопому комерсанту, либо еще более хитрожопому китайцу, либо Большому Брату.<br />
Все трое обладают высокими моральными качествами. Будьте уверены. <br />
А пока я отключил регистратор. До выходных. <br />
<br />
<b>Upd</b>. <a href="http://rvi-cctv.ru/download/334/?PRODUCT=9391">Спецы из Rvi выпустили обновление, которое устраняет взлом регистраторов</a> <br />Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-50159275192982877562017-07-31T13:01:00.008+03:002020-10-24T05:03:46.574+03:00SDS2104X - новая игрушка в моей лаборатории<p>Многих из нас объединяет занятие радиоэлектроникой. Кто-то делает это в свободное время, а у кого-то это еще и профессиональная деятельность.
Но в любом случае сколько нибудь серьезные конструкции отладить без осциллографа очень проблематично. В большинстве случаев — невозможно.
Я расскажу о своем выборе. Надеюсь рассказ будет полезным.</p>
<p>Итак, прежде всего нужно определиться с моделью. Здесь много за и против. Я остановился на Siglent sds2104x.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh24y-rzh4o2nBHdqhHhhCiXqHx9eAtTEFlTYOe5t9IufT8L_D3vMG4kqCgF6MgHwyytJb29lo1EEGMQjrR51Zpw5NEUEhMGCd0OXyk0p66mn7Osmdf5Xd0mcH47lPVROqf6OWLxIYZH09/s1600/sds2104x_13.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh24y-rzh4o2nBHdqhHhhCiXqHx9eAtTEFlTYOe5t9IufT8L_D3vMG4kqCgF6MgHwyytJb29lo1EEGMQjrR51Zpw5NEUEhMGCd0OXyk0p66mn7Osmdf5Xd0mcH47lPVROqf6OWLxIYZH09/s640/sds2104x_13.jpg" width="640" height="480" data-original-width="1280" data-original-height="960" /></a>
<p>Спецификация на осциллограф приведена по ссылке: <a href="https://drive.google.com/file/d/1jnLY13UxZoUmVxbyJZgCDEkZu_KGq4v0/view?usp=sharing" target="_blank">SDS2000X_Datasheet.pdf</a></p>
<p>После посмотрел где наиболее выгодные условия. <a href="http://prist.ru/produce/card.htm?id=3352427235#t=main">Прист</a> отпал сразу со своими ценами почти в два раза выше, чем производителя. На <a data-fancybox="gallery" href="https://www.aliexpress.com/wholesale?ltype=wholesale&d=y&origin=y&blanktest&SearchText=sds2104x&tc=af&initiative_id=SB_20170727024054&isViewCP=y&catId&aff_platform=aaf&cpt=1501591879585&sk=VnYZvQVf&aff_trace_key=5a275e3de6124557a1cf63a3864c68dd-1501591879585-04049-VnYZvQVf">Aliexpress</a> цены, как в Европе. <a href="http://www.siglent.ru/">Siglent.ru</a> — после общения по телефону отпал из-за слабого ассортимента и моего недоверия.</p>
<p>В итоге остановился на <a data-fancybox="gallery" href="https://www.siglent.eu/">Siglent.eu</a>.</p>
<p>Компания находится в Нидерландах.</p>
<p>Я списался с представителем компании. После 3-х дней переговоров Jonas убедил меня взять четырехканальный прибор за 865,00 EUR, что по курсу на день оплаты составило 58000 рублей (аналогичный в Присте стоит <a href="https://prist.ru/catalog/ostsillografy/akip_4126_4a_x/#inner-tab3" target="_blank">118 т.р.</a>).</p>
<p>Оплатил через Paypal (это отдельная история на 2 недели). Из Нидерландов Осциллограф был отправлен 19 июля, а 25 я его забрал с почты.</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">
Date Time Location Status
Tue Jul 25 12:42 RU Shipment delivered
Mon Jul 24 19:21 RU Addressee not present
Mon Jul 24 19:20 RU Driver is en route
Mon Jul 24 19:12 RU Shipment in depot
Sun Jul 23 21:25 RU Released by customs
Sun Jul 23 17:51 RU Shipment at customs
Sun Jul 23 14:27 RU Received in country of destination
Thu Jul 20 08:30 NL Sent to country of destination
Wed Jul 19 21:11 NL Parcel received and in sorting process
Wed Jul 19 13:59 NL Parcel received and in sorting process
Wed Jul 19 13:57 Shipment is expected, but not yet in sorting process</pre></div>
<p>К счастью его не украли, не разбили, я не платил таможенных сборов и налога.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2FW1ouq_tO1ozZL3xIUgyI3JvSbU3LOAm3EZnEqWA9sxbyh1oBxGXOeAYXozJ-2r97v7BtFjyHoIY2qynX5pzZQxU50Zvs3ItlXO8YECSmzIHHuRsYQ23pK82Al4eMqLfJDpxMbav1yBY/s1600/sds2104x_1.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2FW1ouq_tO1ozZL3xIUgyI3JvSbU3LOAm3EZnEqWA9sxbyh1oBxGXOeAYXozJ-2r97v7BtFjyHoIY2qynX5pzZQxU50Zvs3ItlXO8YECSmzIHHuRsYQ23pK82Al4eMqLfJDpxMbav1yBY/s320/sds2104x_1.jpg" width="320" height="240" data-original-width="1280" data-original-height="960" /></a>
<p>Осциллограф был упакован в фирменную картонную коробку и оклеен сверху упаковочной бумагой. Так же присутствовала наклейка «стекло, боится воды».</p>
<p>Судя по нетронутой фирменной почтовой упаковке его нигде не вскрывали.</p>
<p>В общем королевской почте Нидерландов респект. И нашей российской — тоже.</p><br/>
<br/>
<h2>Комплектация</h2>
<br/>
<p>Комплектация небогатая, стандартная:</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxd9a1_CoiQfu8e-PBnAC3ySZG_8aE6AeX99j7mbPkIBLJLk3kkqhaN_i8Bvp4gXKcUVN3uZXtbvYMD-B4v4eOTz5H0qJjYs68dVU0ikZJDAOWEKX5xzrj9S5YsQv0-s5NcuuyVvaGLjhf/s1600/sds2104x_3.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxd9a1_CoiQfu8e-PBnAC3ySZG_8aE6AeX99j7mbPkIBLJLk3kkqhaN_i8Bvp4gXKcUVN3uZXtbvYMD-B4v4eOTz5H0qJjYs68dVU0ikZJDAOWEKX5xzrj9S5YsQv0-s5NcuuyVvaGLjhf/s320/sds2104x_3.jpg" width="320" height="240" data-original-width="1280" data-original-height="960" /></a>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4QNKusEHztRALJkahTO6bUNpa0z2d1Xolz5Agdj7JcSzhsIyVSEH7Otd241WnaBt4mF-UOoP0Sv6O8viTvNFmAlGclD_peV5TEZIaf_QmWoNjwAYbIMv2pZjkOm2XZCNHIgjwj5NDdM7X/s1600/sds2104x_4.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4QNKusEHztRALJkahTO6bUNpa0z2d1Xolz5Agdj7JcSzhsIyVSEH7Otd241WnaBt4mF-UOoP0Sv6O8viTvNFmAlGclD_peV5TEZIaf_QmWoNjwAYbIMv2pZjkOm2XZCNHIgjwj5NDdM7X/s320/sds2104x_4.jpg" width="320" height="240" data-original-width="1280" data-original-height="960" /></a>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHUQD3NqFNS2Cu2QirR3ZC8EHo8FwW1mKHiii1eNlwPPj8cjJ0PuOnEOeVc0pLA5_vfYTwHPc27pnFwMNfPHRRWAGluMQhvbyloGLaMi3WIcugoyDaTryuYjyzDtpA0FYmQ012UovLZzd5/s1600/sds2104x_5.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHUQD3NqFNS2Cu2QirR3ZC8EHo8FwW1mKHiii1eNlwPPj8cjJ0PuOnEOeVc0pLA5_vfYTwHPc27pnFwMNfPHRRWAGluMQhvbyloGLaMi3WIcugoyDaTryuYjyzDtpA0FYmQ012UovLZzd5/s320/sds2104x_5.jpg" width="200" height="240" data-original-width="906" data-original-height="1078" /></a>
<p><ul>
<li>провод питания</li>
<li>провод USB</li>
<li>4 щупа с аксессуарами</li>
<li>диск с ПО</li>
<li>тоненькая инструкция</li>
<li>и листок с заверениями, что все сделано хорошо.</li>
</ul></p>
<p>Щупы обычные. С делителем 1:1 или 1:10.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpJ7tZNey-LF6VcEV3B8RB4qgszBOMjGdRKLkCuABDkyrL7feGICVB2qHDfTRG1Ff6gg8DA66dj4lM3VsbvvlArQfVuP_yzcjujky-r9aRmkwHi-1SGuDLuNQON-TnUHJdKrgQj4z5zKCh/s1600/sds2104x_19.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpJ7tZNey-LF6VcEV3B8RB4qgszBOMjGdRKLkCuABDkyrL7feGICVB2qHDfTRG1Ff6gg8DA66dj4lM3VsbvvlArQfVuP_yzcjujky-r9aRmkwHi-1SGuDLuNQON-TnUHJdKrgQj4z5zKCh/s320/sds2104x_19.jpg" width="320" height="180" data-original-width="1280" data-original-height="721" /></a>
<p>К каждому щупу прилагается набор цветных колец и отвертка для калибровки</p>
<br/>
<br/>
<h2>Внешний вид</h2>
<br/>
<p>Осциллограф имеет размеры 352х224х100 мм</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja7fPy1HUMPyPZwRCoGcvRgOphdzBo2MlRa1GwTkKYfe1DVtrTPDfwRjDOAqyGqVaoSvUXtiLjb4Hv5gNbep_2ZCSXu8qM9g9MFYU7uKx0jypMpRGl6f4Po29_8ur5-sCKa1a4Aq4sGFo-/s1600/sds2104x_6.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja7fPy1HUMPyPZwRCoGcvRgOphdzBo2MlRa1GwTkKYfe1DVtrTPDfwRjDOAqyGqVaoSvUXtiLjb4Hv5gNbep_2ZCSXu8qM9g9MFYU7uKx0jypMpRGl6f4Po29_8ur5-sCKa1a4Aq4sGFo-/s400/sds2104x_6.jpg" width="400" height="400" data-original-width="1105" data-original-height="1303" /></a>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXD_q7USllqSMGMRPRtWqzcMuV4PgmOasvtRsg1CWeZwW23Jq9g1TFSxP9TRCHZUxG6wx7i7IATyMINkxXcG3ZLOqPVlbsuUumfU-5KkPAOaMR9VmZFs4oIBq-JAv5Q-fEEb7YLZvvbH8z/s1600/sds2104x_10.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXD_q7USllqSMGMRPRtWqzcMuV4PgmOasvtRsg1CWeZwW23Jq9g1TFSxP9TRCHZUxG6wx7i7IATyMINkxXcG3ZLOqPVlbsuUumfU-5KkPAOaMR9VmZFs4oIBq-JAv5Q-fEEb7YLZvvbH8z/s400/sds2104x_10.jpg" width="220" height="400" data-original-width="588" data-original-height="1068" /></a>
<p>В нижней части есть откидные ножки, которые задают наклон осциллографа при установке на столе.
Но если ставить на полке на уровне глаз, как у меня, этот наклон не нужен.
Вот и первый косяк. С убранными ножками прибор ровно не стоит, качается. В этом положении пользоваться им не возможно.
Исправляется — приклеиванием прямоугольных кусочков ластика.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihzh7qrFBq8scuIQY8921KmllaF0PoZifvMFKQnXO5CHU4VR4hIxNJ1t4xqyQHTBoKM4PcNbMBH9fDahz5fXA4wKY_eA7q6wmnLvTH-2pCAd1-28zvzFIm9YPrTvin1v3yunQwzDViIHTa/s1600/sds2104x_14.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihzh7qrFBq8scuIQY8921KmllaF0PoZifvMFKQnXO5CHU4VR4hIxNJ1t4xqyQHTBoKM4PcNbMBH9fDahz5fXA4wKY_eA7q6wmnLvTH-2pCAd1-28zvzFIm9YPrTvin1v3yunQwzDViIHTa/s400/sds2104x_14.jpg" width="400" height="300" data-original-width="1280" data-original-height="960" /></a>
<p>В нижней части прибора находятся кнопка включения, разъемы каналов, разъем цифрового анализатора, разъем подключения флэшки, разъем выхода калибратора и разъем встроенного универсального генератора.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjegQS_uyoNRtZYzhLlJByCV1CMje6Mi23Nyi1Hx7fq9dcWvKWCfuVU5EOs8FqlRiAg_sod97YpAsavQgwINXuT3owJ5fiGsSZ7-mF4Mg7tbnwMdozjLVOCXtH0rRnL3rs8cYhiwTlV8aG/s1600/sds2104x_7.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjegQS_uyoNRtZYzhLlJByCV1CMje6Mi23Nyi1Hx7fq9dcWvKWCfuVU5EOs8FqlRiAg_sod97YpAsavQgwINXuT3owJ5fiGsSZ7-mF4Mg7tbnwMdozjLVOCXtH0rRnL3rs8cYhiwTlV8aG/s400/sds2104x_7.jpg" width="640" data-original-width="1280" data-original-height="164" /></a>
<p>Справа от экрана, в нижней части расположены входные аттенюаторы, кнопки включения каналов и регуляторы сдвига осциллограммы по вертикали.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIsAB3iUtIY9mTOnTFl4EqVphV7oDDtkUDATCHtHDY4uc9UMC7uHs7-jKajWhI5USASxkqpphRLEPe63uviAYWhnQRj55kVK0qvA8IapcAMWAqw6e5Pi1pwL2ApyYq7BlGbAL-d52dfGgs/s1600/sds2104x_16.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIsAB3iUtIY9mTOnTFl4EqVphV7oDDtkUDATCHtHDY4uc9UMC7uHs7-jKajWhI5USASxkqpphRLEPe63uviAYWhnQRj55kVK0qvA8IapcAMWAqw6e5Pi1pwL2ApyYq7BlGbAL-d52dfGgs/s640/sds2104x_16.jpg" width="640" height="327" data-original-width="1280" data-original-height="654" /></a>
<p>Органы управления, расположенные в центральной части можно разделить на 4 функциональные зоны:</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizAZU6zOozUi3Z3ukTOwzjALdl_dCYXJJKDoSYtoNerSTnhK_LbKzac2cdC1ZtVM0H6KDj7fflcOgcn20AnqUuqBon_CDVPILjz3kAuVCtjitvGFZaHmaXG0XbqUYWipXd-fYpTJ2gbcN9/s1600/sds2104x_17.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizAZU6zOozUi3Z3ukTOwzjALdl_dCYXJJKDoSYtoNerSTnhK_LbKzac2cdC1ZtVM0H6KDj7fflcOgcn20AnqUuqBon_CDVPILjz3kAuVCtjitvGFZaHmaXG0XbqUYWipXd-fYpTJ2gbcN9/s640/sds2104x_17.jpg" width="640" height="332" data-original-width="1280" data-original-height="663" /></a>
<ul>
<li>многофункциональная ручка выбора режима</li>
<li>управление срабатыванием триггера</li>
<li>выбор функций прибора и режимов измерения-отображения</li>
<li>управление декодерами и математическими операциями</li>
</ul>
<p>В верхней части находятся:</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPFdnaneOzG9nS5FwvfnWQCdSEief9PlO41xKTeYFIZL-dpVKbkJIJ-4l03jSk3g5L_B1GpmaWJwU3Twl9T7wAQf3lrvUvwyLHlBtodG9upG-znJPz0QjcJlSfSlOXIphinEsimXc5icHg/s1600/sds2104x_18.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPFdnaneOzG9nS5FwvfnWQCdSEief9PlO41xKTeYFIZL-dpVKbkJIJ-4l03jSk3g5L_B1GpmaWJwU3Twl9T7wAQf3lrvUvwyLHlBtodG9upG-znJPz0QjcJlSfSlOXIphinEsimXc5icHg/s640/sds2104x_18.jpg" width="640" height="161" data-original-width="1280" data-original-height="321" /></a>
<ul>
<li>органы управления горизонтальной разверткой</li>
<li>синяя кнопка автоустановки режима измерения</li>
<li>однократной, непрерывной синхронизации</li>
<li>кнопка возврата настроек в исходное состояние</li>
<li>кнопка Clear Sweeps</li>
</ul>
<p>Давайте посмотрим, что находится на задней стенке прибора</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixFrKOPhAMOoXSpn_0QN-wLAg6WjvvxqUly6YpLsenHT7x7rQ8bOajlkQyzu4UXghq4gR6dgDz_Ln5gFC04_ZN6znjnrZKjisuHqxp6-L1Gd6bU1Squ2pc7dXtfJqeBVWVkd2CnebFA87O/s1600/sds2104x_8.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixFrKOPhAMOoXSpn_0QN-wLAg6WjvvxqUly6YpLsenHT7x7rQ8bOajlkQyzu4UXghq4gR6dgDz_Ln5gFC04_ZN6znjnrZKjisuHqxp6-L1Gd6bU1Squ2pc7dXtfJqeBVWVkd2CnebFA87O/s640/sds2104x_8.jpg" width="640" height="436" data-original-width="1280" data-original-height="871" /></a>
<p>Мы видим разъем питания, сетевой разъем, два коннектора BNC для подачи сигнала на внешнюю синхронизацию, вентилятор и разъем механической защиты от кражи.</p>
<br/>
<br/>
<h2>Эргономика</h2>
<br/>
<p>После недели использования для меня очевидно, что эргономика и простота использования были важными критериями при разработке этого осциллографа.
В отличие от тысячной серии Rigol здесь на каждый канал присутствует отдельный аттенюатор. Это очень удобно.
Кроме того в приборе сделан упор на включение наиболее востребованных функций одним нажатием.</p>
<p>Об органах управления можно сказать, что они расположены логично и удобно.
Кнопочки тактильно очень приятные. Кнопки с «фиксацией» подсвечиваются зеленым цветом.
Не очень понравились поворотные ручки. На мой вкус могли бы сделать из побольше диаметром. Кроме того, когда на них нажимаешь, возможно изменение установки.
Но это, думаю дело привычки.</p>
<br/>
<br/>
<h2>Включаем</h2>
<br/>
<p>При первом включении активизируется 1-й канал. В дальнейшем прибор будет запоминать последние режимы и автоматически их устанавливать. Если будет необходимо, то можно сбросить все настройки и вернуться к дефолтным значениям нажатием на кнопку «Default».</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHJ6C_DWmGxUylwf91qbPVz0h5LPwi1cegCCA4_ag78hyphenhyphenLPLnQPMFreZ6gw2lhFpYn2L7H1bDLbRC0wEFiCAeHlS3yG9veRfceE912-P3Mz2-pW-MwjE8-7gDmKzYnVT_JHbjnLG04F-eW/s1600/sds2104x_12.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHJ6C_DWmGxUylwf91qbPVz0h5LPwi1cegCCA4_ag78hyphenhyphenLPLnQPMFreZ6gw2lhFpYn2L7H1bDLbRC0wEFiCAeHlS3yG9veRfceE912-P3Mz2-pW-MwjE8-7gDmKzYnVT_JHbjnLG04F-eW/s640/sds2104x_12.jpg" width="640" height="480" data-original-width="1280" data-original-height="960" /></a>
<p>Сразу можно отметить большой дисплей. Цветовая гамма выбрана хорошо. Зона отображения занимает почти весь экран и расчерчена в виде сетки 14х8. Это стандартное количество делений принятое в аналоговых осциллографах.</p>
<p>Снизу под экраном располагаются 6 функциональных кнопок, над которыми появляются контекстно-зависимые подписи и синяя круглая кнопка сохранения экрана. Экраны сохраняются на флэшке в виде BMP файла с разрешением 800х480.</p>
<p>Дальше в обзоре я буду приводить только экраны, поскольку экстерьер мы уже посмотрели.</p>
<p>Первым делом посмотри шумы. Выставляем самую высокую чувствительность 1 mV на деление.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGFBr-n3VR7fC8EysULb4QD5IUvdKBlOz22JXKyYCMXYIOd-ZMeYBZh4xEA00EeJTnOYAJy0_JYsJo8I-j68PKTNVbpOsIvGarfomWO6T58A_k729zC_JAccBENgoeRvzjmXjgXcBH-gak/s1600/sds_screen_2104x_13.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGFBr-n3VR7fC8EysULb4QD5IUvdKBlOz22JXKyYCMXYIOd-ZMeYBZh4xEA00EeJTnOYAJy0_JYsJo8I-j68PKTNVbpOsIvGarfomWO6T58A_k729zC_JAccBENgoeRvzjmXjgXcBH-gak/s640/sds_screen_2104x_13.jpg" width="640" height="384" data-original-width="800" data-original-height="480" /></a>
<p>Мы видим шумы с амплитудой до 3 мВ. По спецификации: stdev ≤ 0.5 div (≥ 2mV/div).</p>
<p>Подключим щуп и замкнем его вход на массу.</p>
<iframe allowfullscreen="" frameborder="0" height="384" src="https://www.youtube.com/embed/mfumRSW1spA" width="640"></iframe>
<p>Видим, что шум вместе с наводками составляет около 5 мВ</p>
<br/>
<br/>
<h2>Встроенный генератор</h2>
<br/>
<p>Встроенный генератор является дополнительной опцией, за которую производитель хочет отдельные деньги.
Нам доступно 30 бесплатных включений. После функция генератора будет вероятно отключена.</p>
<p>Посмотрим работу и основные функции прибора при измерении сигналов от встроенного генератора.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfF7SrVHuMcSUZkSDezrD7FsrtT8zzVtBDvbJbm2jP5tUASFjdOXNDIFq3u9A5Io-CxNwraVIDpnTyADS_qW_Q50aK6lfODjf3wggvwiJFUWO0SvUpmteRRvJLGhQWHHFm-EsYgVxqZvC4/s1600/sds_arb_2104x_1-4.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfF7SrVHuMcSUZkSDezrD7FsrtT8zzVtBDvbJbm2jP5tUASFjdOXNDIFq3u9A5Io-CxNwraVIDpnTyADS_qW_Q50aK6lfODjf3wggvwiJFUWO0SvUpmteRRvJLGhQWHHFm-EsYgVxqZvC4/s400/sds_arb_2104x_1-4.jpg" width="400" height="240" data-original-width="1600" data-original-height="960" /></a><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh96t6LWIY9fLsQQiPONmPD2zlAbu5Y-3VJ92We6xX38BItHdgRAMdCTboGv8rUNbjiuMxy3cKZRmh1f2LLwOsOEFEWjrlnOvmGLBGr1GmOwFik-GlIehcZuSe715itI-l1_4MegVLbSytB/s1600/sds_arb_2104x_5-8.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh96t6LWIY9fLsQQiPONmPD2zlAbu5Y-3VJ92We6xX38BItHdgRAMdCTboGv8rUNbjiuMxy3cKZRmh1f2LLwOsOEFEWjrlnOvmGLBGr1GmOwFik-GlIehcZuSe715itI-l1_4MegVLbSytB/s400/sds_arb_2104x_5-8.jpg" width="400" height="240" data-original-width="1600" data-original-height="960" /></a>
<p>Можно выбрать вид сигнала, амплитуду, частоту, смещение. В общем все основные параметры нам доступны.<p>
<p>Проверим возможности генератора по частоте. Синус у генератора на максимальной частоте 25 МГц вполне приличный.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiONJqqUhuXqCB5zhSoSXIZleZ4BguXKfgSHHYyFAwWtDVoBCVuXyGs82obqHtFp18iy_0En3VUrh9uD_hHxahsmhfUDghPSOpr_3AQDdBk0cOqZiK-71dgMJ-Gz9zBye803ojWAMsVrEvj/s1600/sds_screen_2104x_19.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiONJqqUhuXqCB5zhSoSXIZleZ4BguXKfgSHHYyFAwWtDVoBCVuXyGs82obqHtFp18iy_0En3VUrh9uD_hHxahsmhfUDghPSOpr_3AQDdBk0cOqZiK-71dgMJ-Gz9zBye803ojWAMsVrEvj/s400/sds_screen_2104x_19.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Oyn1p9HjmRChhTSK6Lb8HGwQUPaB3d7lxGdv8NnIv4nkRjM4P7y5Ayx5KbMDyO-e8mJNS1B_k19cJKK0lxmWRTLZxXOcCTHbjU5a846tw33MIsk88l1a4ThzWV6kiYG58-DWkcg7efuZ/s1600/sds_screen_2104x_20.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Oyn1p9HjmRChhTSK6Lb8HGwQUPaB3d7lxGdv8NnIv4nkRjM4P7y5Ayx5KbMDyO-e8mJNS1B_k19cJKK0lxmWRTLZxXOcCTHbjU5a846tw33MIsk88l1a4ThzWV6kiYG58-DWkcg7efuZ/s400/sds_screen_2104x_20.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a>
<p>Меандр 5 МГц вполне еще можно называть меандром.</p>
<p>Для исследования фронта мы воспользовались функцией записи сигнала в память и последующего воспроизведения. В советских приборах эта функция называлась «лупа времени».
Мы выделили участок сигнала и развернули его отдельно. Очень полезная функция.
В целом генератор вполне юзабельный.</p>
<br/>
<br/>
<h2>Встроенные измерения и статистика</h2>
<br/>
<p>Осциллограф позволяет производить различные измерения.</p>
<p>Посмотрим какие параметры сигнала можно измерять.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJfqwnJurFzem_ZnPHgHh07QiA8av-asGclAZU4L5HP-Q-K90BX3WvdMzQyfqZNCHS-cGaDq5JORW6xnjrXIQU2f_0nO5w8zniKu_oMmzBBymQ0cq5_O6AxAjhqUHD-ShbkJcOTye-QwJl/s1600/sds_screen_2104x_03.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJfqwnJurFzem_ZnPHgHh07QiA8av-asGclAZU4L5HP-Q-K90BX3WvdMzQyfqZNCHS-cGaDq5JORW6xnjrXIQU2f_0nO5w8zniKu_oMmzBBymQ0cq5_O6AxAjhqUHD-ShbkJcOTye-QwJl/s400/sds_screen_2104x_03.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHOKEAciyWXFH5UgF5soQvblC8KzsM84oed20YOd4LA-NslFfFYjflKpOWwp0CIv5UbfEQdluHaAiCuGtz1rYMPDNHy9bBYBXd2E2moTn7zc5OSwJQZ6Io2QHer0xBF9XCRn27LFtlE8w7/s1600/sds_screen_2104x_04.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHOKEAciyWXFH5UgF5soQvblC8KzsM84oed20YOd4LA-NslFfFYjflKpOWwp0CIv5UbfEQdluHaAiCuGtz1rYMPDNHy9bBYBXd2E2moTn7zc5OSwJQZ6Io2QHer0xBF9XCRn27LFtlE8w7/s400/sds_screen_2104x_04.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a>
<p>При выборе параметра на экране дается короткое, но достаточно ясное объяснение смысла этого параметра.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmLgoryUNYmYIjQkl9WHizzrjmu_mm5xkVyaP_Vkmqbfg7QXIYNAUKV6UqmS7HfoZabljsGnaJOUA69pdywjKsKsgowOjto3Olcfq7KqSsf_mmL5-eogZ5l0yTRYDUdmvyGaLKl-w0XpJ7/s1600/sds_screen_2104x_05.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmLgoryUNYmYIjQkl9WHizzrjmu_mm5xkVyaP_Vkmqbfg7QXIYNAUKV6UqmS7HfoZabljsGnaJOUA69pdywjKsKsgowOjto3Olcfq7KqSsf_mmL5-eogZ5l0yTRYDUdmvyGaLKl-w0XpJ7/s640/sds_screen_2104x_05.jpg" width="640" height="384" data-original-width="800" data-original-height="480" /></a>
<p>Кроме того, осциллограф позволяет выводить на экран статистику.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC5mgmeFlxOFAe-BYwlpDb_W_ISv8hMb0yVqBzrx6vJE6HOwSQzxz1WeQlzGBkc5V9jVULghDa9mfbYn_FdzSPq4DZPyPDVZi087YRPJszOyzPMYLqAYjdvUNc2mx8gBG6zMfl4z65kAdk/s1600/sds_screen_2104x_26.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC5mgmeFlxOFAe-BYwlpDb_W_ISv8hMb0yVqBzrx6vJE6HOwSQzxz1WeQlzGBkc5V9jVULghDa9mfbYn_FdzSPq4DZPyPDVZi087YRPJszOyzPMYLqAYjdvUNc2mx8gBG6zMfl4z65kAdk/s400/sds_screen_2104x_26.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKCUiHAmsN_V8FHfIjvbHF8hzgD-9_Y94_wyfkYjVPm5glSfohKJHkM3YoY5WPOh66sd_L-UYwFIQznWVkvxnHOJ7jpUHDtLUdZLnM7Birc7rL_7DCJxbO5QnK6mAscd6N6pQ_4YK6x2Ql/s1600/sds_screen_2104x_27.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKCUiHAmsN_V8FHfIjvbHF8hzgD-9_Y94_wyfkYjVPm5glSfohKJHkM3YoY5WPOh66sd_L-UYwFIQznWVkvxnHOJ7jpUHDtLUdZLnM7Birc7rL_7DCJxbO5QnK6mAscd6N6pQ_4YK6x2Ql/s400/sds_screen_2104x_27.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a>
<h2>Полоса пропускания</h2>
<br/>
<p>Полоса пропускания является одним из важнейших показателей осциллографа. Она определяет область применения прибора. Давайте оценим полосу пропускания нашего прибора. Для этого нам потребуется внешний генератор от которого подадим сигнал с частотами от 1 кГц, до 100 МГц. Я использовал Siglent sdg2042х хакнутый до 120 МГц. Для контроля я выставил курсоры по периоду и амплитуде.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8tyH2JERG-k8SbbUnf11s0R3Mxk8E70r5_EHaeTkP67puJpvS_qpLixBXajg8pMRPd1Kd_Jq4o-enTuAYvIkxT8c-AqzBo-fyu6tERFVP1eEVAt-9oCC5ZB8oT3eFF8zWZX5x69Jmhkdg/s1600/sds_freq_01.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8tyH2JERG-k8SbbUnf11s0R3Mxk8E70r5_EHaeTkP67puJpvS_qpLixBXajg8pMRPd1Kd_Jq4o-enTuAYvIkxT8c-AqzBo-fyu6tERFVP1eEVAt-9oCC5ZB8oT3eFF8zWZX5x69Jmhkdg/s640/sds_freq_01.jpg" width="640" height="384" data-original-width="1600" data-original-height="960" /></a>
<p>Я не стал приводить все реперные точки. До 20 МГц полоса линейная. После начинается спад. Выше это показометр. Но в целом все равно хороший.</p>
<br/>
<br/>
<h2>Синхронизация</h2>
<br/>
<p>Осциллограф имеет стандартный джентльменский набор, включающий синхронизации по фронтам, по импульсу, по видео сигналу, по окну, iis данным и много чему еще.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokhFG2GaedcH_J9zgAfd_pAyUIBH_76_qEz8Cph6ScQ2ZmedmXM6MsU_p6MCJJPlZhIOmUilcd2rlKb9z4g8W71VGbAT102Df15Y3VoHm9BtSMaw36nuTuVSOkrtelFbnsVFBkeoF1fBf/s1600/sds_screen_2104x_32.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokhFG2GaedcH_J9zgAfd_pAyUIBH_76_qEz8Cph6ScQ2ZmedmXM6MsU_p6MCJJPlZhIOmUilcd2rlKb9z4g8W71VGbAT102Df15Y3VoHm9BtSMaw36nuTuVSOkrtelFbnsVFBkeoF1fBf/s640/sds_screen_2104x_32.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIE_9c9yAFslD2PRPu5eQG4w50weCwIXUZ54q_8CnkcTSCvxIIXQutjISnXdzWQPlETtzyfCBbFMc-e53b1uhLoNMfY3QeVZFECejh7vfvCL65M7trfKkrDI_FAIkMGyEUXBwc2N9hvJd6/s1600/sds_screen_2104x_35.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIE_9c9yAFslD2PRPu5eQG4w50weCwIXUZ54q_8CnkcTSCvxIIXQutjISnXdzWQPlETtzyfCBbFMc-e53b1uhLoNMfY3QeVZFECejh7vfvCL65M7trfKkrDI_FAIkMGyEUXBwc2N9hvJd6/s640/sds_screen_2104x_35.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a>
<p>Синхронизация у осциллографа очень недурна. Если есть за что зацепиться — он зацепится.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivxSikPS38m9T3X0n9OUXkr3Ad2aV7ozkdBbyvpoWP0H9_kAgEc7ZmUjxRaUW1iGBon3HFQbrHup927E6j-0BgbxZ58tabrT-zDcHu2Y2OvRx9DZ8sGdayU107ihyphenhyphenrXM8hQVn1L3Lee50t/s1600/sds_screen_2104x_06.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivxSikPS38m9T3X0n9OUXkr3Ad2aV7ozkdBbyvpoWP0H9_kAgEc7ZmUjxRaUW1iGBon3HFQbrHup927E6j-0BgbxZ58tabrT-zDcHu2Y2OvRx9DZ8sGdayU107ihyphenhyphenrXM8hQVn1L3Lee50t/s640/sds_screen_2104x_06.jpg" width="640" height="384" data-original-width="800" data-original-height="480" /></a>
<p>Как пример — осциллограмма сложного сигнала с амплитудной модуляцией.</p>
<br/>
<br/>
<h2>Математические вычисления</h2>
<br/>
<p>Осциллограф имеет возможность выполнять различные математические операции над сигналами: сложение, вычитание, БПФ и др.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHUpeM7y5Yb8M3QgTmCEoevRdAOj-WF97xag7FlwDhR4cJ-Gtzxj6WiMDtnMrF5qTop-95dmKl7xSfs2vejXapxotIl7iCoksoI_sxDhu7noBC8yrj4ncS2APwqOaAm4bVklFV-e4LMZlT/s1600/sds_math_2104x_1.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHUpeM7y5Yb8M3QgTmCEoevRdAOj-WF97xag7FlwDhR4cJ-Gtzxj6WiMDtnMrF5qTop-95dmKl7xSfs2vejXapxotIl7iCoksoI_sxDhu7noBC8yrj4ncS2APwqOaAm4bVklFV-e4LMZlT/s640/sds_math_2104x_1.jpg" width="640" height="384" data-original-width="800" data-original-height="480" /></a>
<p>На осциллограмме показана БПФ над синусоидальным сигналом</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9lx7X_j5MUoFnZcxbXKYz1BNJ-AHjVfABDgBueBVtxeteMpr6NUgceNfcj7df75qo0RjtSDSLTRCuRz8bN1f1NfdBxaajyjV7MflOYOZntOqsFmhY1_gH9ymen6C-3wikgoIalGhCbGka/s1600/sds_math_2104x_2.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9lx7X_j5MUoFnZcxbXKYz1BNJ-AHjVfABDgBueBVtxeteMpr6NUgceNfcj7df75qo0RjtSDSLTRCuRz8bN1f1NfdBxaajyjV7MflOYOZntOqsFmhY1_gH9ymen6C-3wikgoIalGhCbGka/s640/sds_math_2104x_2.jpg" width="640" height="384" data-original-width="800" data-original-height="480" /></a>
<p>и над меандром</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS1qtFDEbdFTFSjk24NVhdyOqPMEdaQmka_hB_5o_aJiKY8Ud9mfhdkCRKw1QXlbA0OCGF3BX0WKhN4FGFuWXioPwluK7cnKoMMmPLgCOXsKnxtn7EJSwIX1tSPtHlkJs1pYcesbF7vXBu/s1600/sds_math_2104x_3.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS1qtFDEbdFTFSjk24NVhdyOqPMEdaQmka_hB_5o_aJiKY8Ud9mfhdkCRKw1QXlbA0OCGF3BX0WKhN4FGFuWXioPwluK7cnKoMMmPLgCOXsKnxtn7EJSwIX1tSPtHlkJs1pYcesbF7vXBu/s640/sds_math_2104x_3.jpg" width="640" height="384" data-original-width="800" data-original-height="480" /></a>
<br/>
<br/>
<br/>
<h2>LAN - сетевое подключенине</h2>
<br/>
<p>Осциллограф, как я писал выше, имеет возможность подключения по сети.</p>
<p>Сканирование командой map показывает какие протоколы поддерживаются:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ nmap 192.168.56.22
Starting Nmap 7.01 ( https://nmap.org ) at 2017-07-30 21:13 MSK
Nmap scan report for 192.168.56.22
Host is up (0.00081s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
80/tcp closed http
111/tcp open rpcbind
9009/tcp open pichat
Nmap done: 1 IP address (1 host up) scanned in 8.55 seconds</pre></div>
<p>Видно, что http протокол закрыт, а открыты два протокола rpcbind и pichat. они используются для поддержки протокола <a href="http://www.vxibus.org/specifications.html">VXI-11</a> (<a href="http://www.vxibus.org/">VXIbus Consortium</a>) для организации связи с прибором</p>
<p>Существует <a data-fancybox="gallery" href="https://github.com/python-ivi/python-vxi11">открытая реализация обмена</a> по этому протоколу написанная на языке python.</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import vxi11
>>> instr = vxi11.Instrument("TCPIP::192.168.56.22::INSTR")
>>> print(instr.ask("*IDN?"))
*IDN SIGLENT,SDS2104X,SDS2XJBC1L1232,1.2.2.1 R9
>>> </pre></div>
<br/>
<br/>
<h2>Жадность</h2>
<br/>
<p>За использование трех дополнительных функций встроенный генератор, цифровой анализатор и декодер предлагается заплатить отдельные деньги в размере 434 евро.</p>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_sUxz41uHuPnzF_9_ZTCXg9AZUwjDJoBL13dCYfgduUTBJQtJof2rJ5DaY59w1bE9fNJ7NBTM6HR0tyZl9iZBfn_qZIBdE9GcJAshib329BYV4yfGM4c5DroVs8vha4RoYOqDdBdAT09L/s1600/sds_screen_2104x_01.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_sUxz41uHuPnzF_9_ZTCXg9AZUwjDJoBL13dCYfgduUTBJQtJof2rJ5DaY59w1bE9fNJ7NBTM6HR0tyZl9iZBfn_qZIBdE9GcJAshib329BYV4yfGM4c5DroVs8vha4RoYOqDdBdAT09L/s400/sds_screen_2104x_01.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtc9NXHgC3SVwtV9eaPn0PrCUe3lL-lfL0bsRXuaftQMPh83SCSLkwDNj0P2HqKqR9DPUol3PUaEbCsgj9EfjbA8OMwU5GWzJS00yDqjrAnLmSz2u3j_Na5dlat7AmEbIoR40JvPNtA9em/s1600/sds_screen_2104x_02.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtc9NXHgC3SVwtV9eaPn0PrCUe3lL-lfL0bsRXuaftQMPh83SCSLkwDNj0P2HqKqR9DPUol3PUaEbCsgj9EfjbA8OMwU5GWzJS00yDqjrAnLmSz2u3j_Na5dlat7AmEbIoR40JvPNtA9em/s400/sds_screen_2104x_02.jpg" width="400" height="240" data-original-width="800" data-original-height="480" /></a>
<p>Пока взлома нет.</p>
<br/>
<br/>
<h2>Видеообзоры</h2>
<br/>
<p>В сети есть пара тройка неплохих видеообзоров этого прибора.
Видеообзор от главного редактора журнала Design World</p>
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/fpmWzIEm4Dk" width="480"></iframe>
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/Hp3tNviztjY" width="480"></iframe>
<p>На широко известном видеоблоге eevblog есть видеообзор с разборкой</p>
<br/>
<br/>
<h2>Выводы</h2>
<br/>
<p>Я долгое время проработал с советскими осциллографами, можно сказать легендарными С1-65, С1-74 и малогабаритным С1-94.
Последний год не шатко — не валко пользовался UNI-T 2102CEL-R.<p>
<p>SDS2104x — безусловно великолепное устройство, которое дает удобство использования и широкий набор функций.
Несмотря на мелкие косяки и жадность с дополнительными лицензиями, мне прибор очень нравится.
Он может кроме осциллографа заменить собой мультиметр, генератор сигналов и цифровой анализатор.<p>
<p>Китайщиной от него и не пахнет.<p>
<p>Я конечно не рассмотрел все функции и режимы, коих здесь очень много.<p>
<p>Но, надеюсь, общее представление о приборе составил.</p>
<br/>
<br/>
<b>Полезные ссылки:</b><br />
<ul>
<li><a href="https://www.eevblog.com/forum/testgear/siglent-sds2000-new-v2-firmware/">Обсуждение sds2000x серии осциллографов на eevblog</a>
</li>
<li><a href="https://www.eevblog.com/forum/testgear/siglent-ads-firmware-file-format/">Исследование внутреннего формата файла прошивки</a>
</li>
<li><a href="https://drive.google.com/file/d/1LyD_LDIUMG3HPIPKFll8UL3LmimP2IWC/view?usp=sharing" target="_blank">User manual</a>
</li>
<li><a href="https://drive.google.com/file/d/1JRPpMS2_w-HULTXvvM5pUtVGE4Mn_bvM/view?usp=sharing" target="_blank">Service manual</a>
</li>
<li><a href="https://drive.google.com/file/d/1-HmYwcRk106eX_bwMSHR2MunM-lEBw_P/view?usp=sharing" target="_blank">Programming Guide</a>
</li>
</ul>Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-64536607136411213782017-02-10T00:05:00.002+03:002017-08-03T16:02:18.526+03:00Проектирование лабораторного источника питания.<br />
<div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;">
<img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiriyObMuB6SXKqcPPXoBd07tKLbfrKZdJc4pUuMIwPxkgD9n60WposoVNHJ6D1wffcOG3qxcHVDvceiIEFhE4pNA-eG8-F84cC5hX91zKx41Uq9LpTQnTV2s9aexJfYMOat5MA5RfA43zE/s320/Power-Supply-KA3005P.jpg" width="320" /> </div>
<br />
Когда то я работал разработчиком РЭА.Как мне кажется очень неплохим.<br />
Решил взяться за старое 8-)<br />
<br />
Недавно я собрал для разработки и отладки домашних поделок двухполярный линейный бдлок питания.<br />
<br />
Сейчас заморочился сделать блок питания с процессорным управлением.<br />
<br />
Конечно дешевле купить китайский. Стоят они около 100 баксов.<br />
Вот модель, которая называется <a data-fancybox="gallery" href="https://ru.aliexpress.com/item/FREE-SHIPPING-KORAD-DC-Power-Supply-KA3005D-Precision-Variable-Adjustable-30V-5A-LAB-GRADE/32600955335.html?ws_ab_test=searchweb0_0,searchweb201602_1_10065_10068_10000074_10000032_119_10000025_10000029_430_10000028_10060_10000067_10062_10056_10055_10000062_10054_301_10059_10099_10000022_10000013_10103_10102_10000016_10096_10000018_10000019_10000056_10000059_10052_10053_10107_10050_10106_10051_10000053_10000007_10000050_10084_10117_10083_10000047_10080_10082_10081_10110_10111_10112_10113_10114_10115_10037_10000041_10000044_10078_10079_10077_10000038_10073_10000035_10121,searchweb201603_10,afswitch_4_afChannel,single_sort_0_total_tranpro_desc&btsid=661fd644-787b-4fd8-83d3-27e82167ef6b">KORAD KA3005P.</a> Это очень хорошая конструкция. Внутри установлен линейный стабилизатор. Управление полностью от микроконтроллера. Позворляет стабилизировать ток ил напряжение. Можно сохранить четыре установки.<br />
<br />
Но мы же сами с усами. Будем сами разрабатывать и собирать.<br />
<br />
Вот хороший цикл статей по проектированию блока питания с цифровым управлением:<br />
<br />
<b><i>Fully Programmable Modular Bench Power Supply:</i></b><br />
<table style="width:100%">
<tr>
<td><a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-1/">Part 1</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-2/">Part 2</a>
<br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-3/">Part 3</a>
<br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-4/">Part 4</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-5/">Part 5</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-6/">Part 6</a>
<br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-7/">Part 7</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-8/">Part 8</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-9/">Part 9</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-10/">Part 10</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-11/">Part 11</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-12/">Part 12</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-13/">Part 13</a><br />
<a href="http://gerrysweeney.com/fully-programmable-modular-bench-power-supply-part-14/">Part 14</a><br />
</td>
<td><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimNHo3rP0Y3M1mbauFH97kVvs3GaSGOxdkRuNuN2Umf3HNZiEyNaigxIEUuDaFewFC8sTmulid-Qa5da-1cloWmm884oUfyQfxW5D585KCzSaKY1ncLS5_HiYIWuGpio834PQjcmLtoX9x/s1600/PSU_0.7_3-1024x714.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimNHo3rP0Y3M1mbauFH97kVvs3GaSGOxdkRuNuN2Umf3HNZiEyNaigxIEUuDaFewFC8sTmulid-Qa5da-1cloWmm884oUfyQfxW5D585KCzSaKY1ncLS5_HiYIWuGpio834PQjcmLtoX9x/s320/PSU_0.7_3-1024x714.png" width="320" height="223" /></a>
</td>
<td><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1iNvV79QvRbbPWRCvj_okhyGfBDD6pCVKljLd2UdLjqmexkaI09RzFJ0P7rKCP_-AGN2GBvAJir726VliIKbT2wNxK_n8iwVngjd7knFydbc9NkP2RRWN106lVLujAmui9jDHvqagNm-q/s1600/PSU_0_6_REG-1024x717.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1iNvV79QvRbbPWRCvj_okhyGfBDD6pCVKljLd2UdLjqmexkaI09RzFJ0P7rKCP_-AGN2GBvAJir726VliIKbT2wNxK_n8iwVngjd7knFydbc9NkP2RRWN106lVLujAmui9jDHvqagNm-q/s320/PSU_0_6_REG-1024x717.png" width="320" height="224" /></a>
</td>
</tr>
</table>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-64048838150957133912017-01-11T23:48:00.003+03:002017-09-28T15:12:35.594+03:00Гайд по обеспечению безопасности Linux-системы<br/>
<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRp5zNaWb9ii_RkB9zOhvVJDNXSS8dCYMd4tr4F4hyphenhyphenVjxFnZ4UkRBBtJNFQ77fQCULuBEdENfa4pZk0ytt9myAuGIorQu0FsxVmYYAn1llH3tg5wzQezwOy0xSg5N-Y8KLUgOb_zEmMaDC/s1600/tux-master.png" style="float: left; height: 120px; width: 120px;" vspace="5" /></div>
<p style="margin-left: 30%;"><i>Коллега на работе показал мне <a href="https://xakep.ru/2014/10/02/paranoid-linuxoid">статью из журнала Хакер по защите систем на базе Linux</a>.<br>
Статья просто великолепна, и, учитывая, что интернет сейчас активно перлюстрируется размещаю ее у себя в блоге. На всякий случай</i><p><br/>
<br/>
<br/>
<p><b><a href="#Введение">Введение</a></b><br/>
<b><a href="#Пароль">Пароль</a></b><br/>
<b><a href="#Шифруемся">Шифруемся</a></b><br/>
<b><a href="#Заметаем">Заметаем следы</a></b><br/>
<b><a href="#Предотвращение BruteForce-атак">Предотвращение BruteForce-атак</a></b><br/>
<b><a href="#Угроза извне">Угроза извне</a></b><br/>
<b><a href="#Выявляем вторжения">Выявляем вторжения</a></b><br/>
<b><a href="#Кто-то наследил…">Кто-то наследил…</a></b><br/>
<b><a href="#За пределами">За пределами</a></b><br/>
<b><a href="#Луковая маршрутизация">Луковая маршрутизация</a></b><br/>
<b><a href="#Борьба с флудом">Борьба с флудом</a></b><br/>
<b><a href="#Выводы">Выводы</a></b></p>
<br/>
<p>Никто из нас не хочет, чтобы личная информация попала в чужие руки. Но как защитить систему от атак и хищений данных? Неужели придется читать километровые мануалы по настройке и алгоритмам шифрования? Совсем не обязательно. В этой статье я расскажу, как сделать Linux-систему безопасной буквально за 30 минут.</p>
<br/>
<a name="Введение"></a>
<h2>Введение</h2>
<p>Мы живем в век мобильных устройств и постоянного онлайна. Мы ходим в кафе с ноутбуком и запускаем на домашних машинах веб-серверы, выставленные в интернет. Мы регистрируемся на сотнях сайтов и используем одинаковые пароли для веб-сервисов. В наших карманах всегда лежит смартфон, в который забиты десятки паролей, и хранятся ключи от нескольких SSH-серверов. Мы настолько привыкли к тому, что сторонние сервисы заботятся о нашей конфиденциальности, что уже перестали уделять ей внимание.</p>
<p>Когда я потерял смартфон, мне сильно повезло, что установленный на него антивор оказался работоспособным и позволил удаленно стереть все данные из памяти девайса. Когда я по невнимательности открыл SSH-порт на домашней машине с юзером без пароля (!) во внешний мир (!!), мне сильно повезло, что на машину пробрались скрипт-кидди, которые кроме смешной истории шелла не оставили никаких серьезных следов своего пребывания в системе. Когда я случайно опубликовал в интернете листинг со своим паролем от Gmail, мне сильно повезло, что нашелся добрый человек, который предупредил меня об этом.</p>
<p>Может быть, я и раздолбай, но я твердо уверен, что подобные казусы случались со многими, кто читает эти строки. И хорошо, если эти люди, в отличие от меня, серьезно позаботились о защите своей машины. Ведь антивор мог бы и не сработать, и вместо скрипт-кидди в машину могли пробраться серьезные люди, и потерять я мог не смартфон, а ноутбук, на котором кроме пароля пользователя не было никакой другой защиты. Нет, полагаться на одну двухфакторную аутентификацию Google и дурацкие пароли в наш век определенно не стоит, нужно что-то более серьезное.</p>
<p>Эта статья — гайд параноидального юниксоида, посвященный тотальной защите Linux-машины от всего и вся. Я не решусь сказать, что все описанное здесь обязательно к применению. Совсем наоборот, это сборник рецептов, информацию из которого можно использовать для защиты себя и данных на тех рубежах, где это нужно именно в твоей конкретной ситуации.</p>
<br/>
<a name="Пароль"></a>
<h2>Пароль!</h2>
<p>Все начинается с паролей. Они везде: в окне логина в Linux-дистрибутиве, в формах регистрации на интернет-сайтах, на FTP- и SSH-серверах и на экране блокировки смартфона. Стандарт для паролей сегодня — это 8–12 символов в разном регистре с включением цифр. Генерировать такие пароли своим собственным умом довольно утомительно, но есть простой способ сделать это автоматически:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ openssl rand -base64 6</pre></div>
<p>Никаких внешних приложений, никаких расширений для веб-браузеров, OpenSSL есть на любой машине. Хотя, если кому-то будет удобней, он может установить и использовать для этих целей pwgen (поговаривают, пароль получится более стойким):</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ pwgen -Bs 8 1</pre></div>
<p>Где хранить пароли? Сегодня у каждого юзера их так много, что хранить все в голове просто невозможно. Довериться системе автосохранения браузера? Можно, но кто знает, как Google или Mozilla будет к ним относиться. Сноуден рассказывал, что не очень хорошо. Поэтому пароли надо хранить на самой машине в зашифрованном контейнере. Отцы-основатели рекомендуют использовать для этого KeePassX. Штука графическая, что не сильно нравится самим отцам-основателям, но зато работает везде, включая известный гугль-зонд Android (KeePassDroid). Останется лишь перекинуть базу с паролями куда надо.</p>
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEUGD98Ky0IeOgbDY6lOz2YpJKQpyD6YKQUDtj7EPJg_aQwpWN83O2t6Az-PuuZgOAAxJ5Z8m9cxpMODmf4YmfSZeJj8DqLLb45jHbWITwEtDEsKDVrpAQ22HrkpIDufxwqLJDD8H7a1U/s1600/generate_pass.jpg" /></div>
<br/>
<a name="Шифруемся"></a>
<h2>Шифруемся</h2>
<p>Шифрование — как много в этом слове… Сегодня шифрование везде и нигде одновременно. Нас заставляют пользоваться HTTPS-версиями сайтов, а нам все равно. Нам говорят: «Шифруй домашний каталог», а мы говорим: «Потом настрою». Нам говорят: «Любимое занятие сотрудников Dropbox — это ржать над личными фотками юзеров», а мы: «Пусть ржут». Между тем шифрование — это единственное абсолютное средство защиты на сегодняшний день. А еще оно очень доступно и сглаживает морщины.</p>
<p>В Linux можно найти тонны средств шифрования всего и вся, от разделов на жестком диске до одиночных файлов. Три наиболее известных и проверенных временем инструмента — это dm-crypt/LUKS, ecryptfs и encfs. Первый шифрует целые диски и разделы, второй и третий — каталоги с важной информацией, каждый файл в отдельности, что очень удобно, если потребуется делать инкрементальные бэкапы или использовать в связке с Dropbox. Также есть несколько менее известных инструментов, включая TrueCrypt например.</p>
<p>Сразу оговорюсь, что шифровать весь диск целиком — задача сложная и, что самое важное, бесполезная. Ничего особо конфиденциального в корневом каталоге нет и быть не может, а вот домашний каталог и своп просто кладезь инфы. Причем второй даже больше, чем первый, так как туда могут попасть данные и пароли уже в расшифрованном виде (нормальные программеры запрещают системе скидывать такие данные в своп, но таких меньшинство). Настроить шифрование и того и другого очень просто, достаточно установить инструменты ecrypts:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install ecryptfs-utils</pre></div>
<p>И, собственно, включить шифрование:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo ecryptfs-setup-swap
$ ecryptfs-setup-private</pre></div>
<p>Далее достаточно ввести свой пароль, используемый для логина, и перезайти в систему. Да, все действительно так просто. Первая команда зашифрует и перемонтирует своп, изменив нужные строки в /etc/fstab. Вторая — создаст каталоги ~/.Private и ~/Private, в которых будут храниться зашифрованные и расшифрованные файлы соответственно. При входе в систему будет срабатывать PAM-модуль pam_ecryptfs.so, который смонтирует первый каталог на второй с прозрачным шифрованием данных. После размонтирования ~/Private окажется пуст, а ~/.Private будет содержать все файлы в зашифрованном виде.</p>
<p>Не возбраняется шифровать и весь домашний каталог целиком. Производительность при этом упадет не сильно, зато под защитой окажутся вообще все файлы, включая тот же сетевой каталог ~/Dropbox. Делается это так:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># ecryptfs-migrate-home -u vasya</pre></div>
<p>Кстати, места на диске должно быть в 2,5 раза больше, чем данных у vasya, так что рекомендую заранее почиститься. После завершения операции следует сразу войти под юзером vasya и проверить работоспособность:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ mount | grep Private
/home/vasya/.Private on /home/vasya type ecryptfs ...</pre></div>
<p>Если все ок, незашифрованную копию данных можно затереть:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo rm -r /home/vasya.*</pre></div>
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWuQV3TMc3pkCpVJusj1V1siqmUzYnUBxWlGUyzYiiAkHOfOdiNmzp2oo-6C_hNhgW2Qj4yu4miuMPrB_sKaTRq_NoixLeg5M8mOd7i0lTzrxwloIe7l60i35dh_9DNbAJWIR2gbcq4a2H/s800/ecryptfs.jpg" /></div>
<p>Ecryptfs предупреждает нас</p>
<br/>
<a name="Заметаем"></a>
<h2>Заметаем следы</h2>
<p>ОK, пароли в надежном месте, личные файлы тоже, что теперь? А теперь мы должны позаботиться о том, чтобы какие-то куски наших личных данных не попали в чужие руки. Ни для кого не секрет, что при удалении файла его актуальное содержимое остается на носителе даже в том случае, если после этого произвести форматирование. Наши зашифрованные данные будут в сохранности даже после стирания, но как быть с флешками и прочими картами памяти? Здесь нам пригодится утилита srm, которая не просто удаляет файл, но и заполняет оставшиеся после него блоки данных мусором:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install secure-delete
$ srm секретный-файл.txt home-video.mpg</pre></div>
<p>Как всегда, все просто до безобразия. Далее, если речь идет о всем носителе, то можно воспользоваться старым добрым dd:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># dd if=/dev/zero of=/dev/sdb</pre></div>
<p>Эта команда сотрет все данные на флешке sdb. Далее останется создать таблицу разделов (с одним разделом) и отформатировать в нужную ФС. Использовать для этого рекомендуется fdisk и mkfs.vfat, но можно обойтись и графическим gparted.</p>
<br/>
<a name="Предотвращение BruteForce-атак"></a>
<h2>Предотвращение BruteForce-атак</h2>
<p>Fail2ban — демон, который просматривает логи на предмет попыток подобрать пароли к сетевым сервисам. Если такие попытки найдены, то подозрительный IP-адрес блокируется средствами iptables или TCP Wrappers. Сервис способен оповещать владельца хоста об инциденте по email и сбрасывать блокировку через заданное время. Изначально Fail2ban разрабатывался для защиты SSH, сегодня предлагаются готовые примеры для Apache, lighttpd, Postfix, exim, Cyrus IMAP, named и так далее. Причем один процесс Fail2ban может защищать сразу несколько сервисов.</p>
<p>В Ubuntu/Debian для установки набираем:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># apt-get install fail2ban</pre></div>
<p>Конфиги находятся в каталоге /etc/fail2ban. После изменения конфигурации следует перезапускать fail2ban командой:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># /etc/init.d/fail2ban restart</pre></div>
<br/>
<a name="Угроза извне"></a>
<h2>Угроза извне</h2>
<p>Теперь позаботимся об угрозах, исходящих из недр всемирной паутины. Здесь я должен был бы начать рассказ об iptables и pf, запущенном на выделенной машине под управлением OpenBSD, но все это излишне, когда есть ipkungfu. Что это такое? Это скрипт, который произведет за нас всю грязную работу по конфигурированию брандмауэра, без необходимости составлять километровые списки правил. Устанавливаем:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install ipkungfu</pre></div>
<p>Правим конфиг:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo vi /etc/ipkungfu/ipkungfu.conf
# Локальная сеть, если есть — пишем адрес сети вместе с маской, нет — пишем loopback-адрес
LOCAL_NET="127.0.0.1"
# Наша машина не является шлюзом
GATEWAY=0
# Закрываем нужные порты
FORBIDDEN_PORTS="135 137 139"
# Блокируем пинги, 90% киддисов отвалится на этом этапе
BLOCK_PINGS=1
# Дропаем подозрительные пакеты (разного рода флуд)
SUSPECT="DROP"
# Дропаем «неправильные» пакеты (некоторые типы DoS)
KNOWN_BAD="DROP"
# Сканирование портов? В трэш!
PORT_SCAN="DROP"</pre></div>
<p>Для включения ipkungfu открываем файл /etc/default/ipkungfu и меняем строку IPKFSTART = 0 на IPKFSTART = 1. Запускаем:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo ipkungfu</pre></div>
<p>Дополнительно внесем правки в /etc/sysctl.conf:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo vi /etc/systcl.conf
# Дропаем ICMP-редиректы (против атак типа MITM)
net.ipv4.conf.all.accept_redirects=0
net.ipv6.conf.all.accept_redirects=0
# Включаем механизм TCP syncookies
net.ipv4.tcp_syncookies=1
# Различные твики (защита от спуфинга, увеличение очереди «полуоткрытых» TCP-соединений и так далее)
net.ipv4.tcp_timestamps=0
net.ipv4.conf.all.rp_filter=1
net.ipv4.tcp_max_syn_backlog=1280
kernel.core_uses_pid=1</pre></div>
<p>Активируем изменения:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo sysctl -p</pre></div>
<br/>
<a name="Выявляем вторжения"></a>
<h2>Выявляем вторжения</h2>
<p>Snort — один из любимейших инструментов админов и главный фигурант всех руководств по безопасности. Штука с долгой историей и колоссальными возможностями, которой посвящены целые книги. Что он делает в нашем гайде по быстрой настройке безопасной системы? А здесь ему самое место, Snort можно и не конфигурировать:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install snort
$ snort -D</pre></div>
<p>Все! Я не шучу, стандартных настроек Snort более чем достаточно для защиты типовых сетевых сервисов, если, конечно, они у тебя есть. Нужно только время от времени просматривать лог. А в нем можно обнаружить строки типа этих:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">[**] [1:2329:6] MS-SQL probe response overflow attempt [**]
[Classification: Attempted User Privilege Gain] [Priority: 1]
[Xref => [url]http://www.securityfocus.com/bid/9407][/url]</pre></div>
<p>Упс. Кто-то пытался вызвать переполнение буфера в MySQL. Тут сразу есть и ссылочка на страницу с детальным описанием проблемы. Красота.</p>
<br/>
<a name="Кто-то наследил…"></a>
<h2>Кто-то наследил…</h2>
<p>Кто-то особенно умный смог обойти наш брандмауэр, пройти мимо Snort, получить права root в системе и теперь ходит в систему регулярно, используя установленный бэкдор. Нехорошо, бэкдор надо найти, удалить, а систему обновить. Для поиска руткитов и бэкдоров используем rkhunter:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install rkhunter</pre></div>
<p>Запускаем:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo rkhunter -c --sk</pre></div>
<p>Софтина проверит всю систему на наличие руткитов и выведет на экран результаты. Если зловред все-таки найдется, rkhunter укажет на место и его можно будет затереть. Более детальный лог располагается здесь: /var/log/rkhunter.log. Запускать rkhunter лучше в качестве cron-задания ежедневно:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo vi /etc/cron.daily/rkhunter.sh
#!/bin/bash
/usr/bin/rkhunter -c --cronjob 2>&1 | mail -s "RKhunter Scan Results" vasya@email.com</pre></div>
<p>Заменяем email-адрес Васи на свой и делаем скрипт исполняемым:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo chmod +x /etc/cron.daily/rkhunter.sh</pre></div>
<p>Базу rkhunter рекомендуется время от времени обновлять с помощью такой команды:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo rkhunter --update</pre></div>
<p>Ее, кстати, можно добавить перед командой проверки в cron-сценарий. Еще два инструмента поиска руткитов:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install tiger
$ sudo tiger
$ sudo apt-get install lynis
$ sudo lynis -c</pre></div>
<p>По сути, те же яйца Фаберже с высоты птичьего полета, но базы у них различные. Возможно, с их помощью удастся выявить то, что пропустил rkhunter. Ну и на закуску debsums — инструмент для сверки контрольных сумм файлов, установленных пакетов с эталоном. Ставим:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install debsums</pre></div>
<p>Запускаем проверку:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo debsums -ac</pre></div>
<p>Как всегда? запуск можно добавить в задания cron.<p>
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV8JECF9XulRIASm5X4UgRDhldIIU1_yU9a-4tgCFzdrY7scKtj9FBcTd4U7oWRO8EaXDmJfGKpVo6c5TUqYQClXWSCi1vv1V8o4ibzo1C4JiXVxJKUG10v-Sw18aS_9OVScYjcoP4bEZl/s800/rkhunter2.jpg" /></div>
<p>rkhunter за работой</p>
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis4QqFYsWPl45TId_vMeRv3c7_JZqa3PIHTpUE4miULPdIdYONDDKaCXANXesOZqAOMc9QKdsjiVNMrPyJFSiQDLx68saYBOqFQiWQlMzhAcXnsKl0InHVQp52sMci2CCm5vGoXBFjXJY8/s800/rkhunter.jpg" /></div>
<p>В моей системе руткитов нет</p>
<br/>
<a name="За пределами"></a>
<h2>За пределами</h2>
<p>Теперь поговорим о том, как сохранить свою анонимность в Сети и получить доступ к сайтам и страницам, заблокированным по требованию различных организаций-правообладателей и прочих Мизулиных. Самый простой способ сделать это — воспользоваться одним из тысяч прокси-серверов по всему миру. Многие из них бесплатны, но зачастую обрезают канал до скорости древнего аналогового модема.</p>
<p>Чтобы спокойно ходить по сайтам и только в случае необходимости включать прокси, можно воспользоваться одним из множества расширений для Chrome и Firefox, которые легко находятся в каталоге по запросу proxy switcher. Устанавливаем, вбиваем список нужных прокси и переключаемся на нужный, увидев вместо страницы табличку «Доступ к странице ограничен по требованию господина Скумбриевича».</p>
<p>В тех ситуациях, когда под фильтр попал весь сайт и его адрес внесли в черный список на стороне DNS-серверов провайдеров, можно воспользоваться свободными DNS-серверами, адреса которых опубликованы здесь. Просто берем два любых понравившихся адреса и добавляем в /etc/resolv.conf:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">nameserver 156.154.70.22
nameserver 156.154.71.22</pre></div>
<p>Чтобы разного рода DHCP-клиенты и NetworkManager’ы не перезаписали файл адресами, полученными от провайдера или роутера, делаем файл неперезаписываемым с помощью расширенных атрибутов:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo chattr +i /etc/resolv.conf</pre></div>
<p>После этого файл станет защищен от записи для всех, включая root.</p>
<p>Чтобы еще более анонимизировать свое пребывание в Сети, можно воспользоваться также демоном dnscrypt, который будет шифровать все запросы к DNS-серверу в дополнение к прокси-серверу, используемому для соединения с самим сайтом. Устанавливаем:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ wget http://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-proxy-1.3.2.tar.bz2
$ bunzip2 -cd dnscrypt-proxy-*.tar.bz2 | tar xvf -
$ cd dnscrypt-proxy-*
$ sudo apt-get install build-essential
$ ./configure && make -j2
$ sudo make install</pre></div>
<p>Указываем в /etc/resolv.conf loopback-адрес:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ vi /etc/resolv.conf
nameserver 127.0.0.1</pre></div>
<p>Запускаем демон:<p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo dnscrypt-proxy --daemonize</pre></div>
<p>Кстати, версии dnscrypt есть для Windows, iOS и Android.</p>
<br/>
<a name="Луковая маршрутизация"></a>
<h2>Луковая маршрутизация</h2>
<p>Что такое луковая маршрутизация? Это Tor. А Tor, в свою очередь, — это система, которая позволяет создать полностью анонимную сеть с выходом в интернет. Термин «луковый» здесь применен относительно модели работы, при которой любой сетевой пакет будет «обернут» в три слоя шифрования и пройдет на пути к адресату через три ноды, каждая из которых будет снимать свой слой и передавать результат дальше. Все, конечно, сложнее, но для нас важно только то, что это один из немногих типов организации сети, который позволяет сохранить полную анонимность.</p>
<p>Тем не менее, где есть анонимность, там есть и проблемы соединения. И у Tor их как минимум три: он чудовищно медленный (спасибо шифрованию и передаче через цепочку нод), он будет создавать нагрузку на твою сеть (потому что ты сам будешь одной из нод), и он уязвим для перехвата трафика. Последнее — естественное следствие возможности выхода в интернет из Tor-сети: последняя нода (выходная) будет снимать последний слой шифрования и может получить доступ к данным.</p>
<p>Тем не менее Tor очень легко установить и использовать:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ sudo apt-get install tor</pre></div>
<p>Все, теперь на локальной машине будет прокси-сервер, ведущий в сеть Tor. Адрес: 127.0.0.1:9050, вбить в браузер можно с помощью все того же расширения, ну или добавить через настройки. Имей в виду, что это SOCKS, а не HTTP-прокси.</p>
<div class="separator" style="clear: both; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEsgRuPKRM0sGvZNrBdQCGDfTQlHQvPM0pZ9GV5_Rr-4wYuUBK8-sQ1rqSer-Uzm-9y8su7DrLMAHhUq4YDZYTAOhTW-X6L51wuBsPH1SKn1xBXwuCLwnvqJfKpAFX1dKdJyDOTmCY4Rk4/s1000/tor.jpg" /></div>
<br/>
<a name="Борьба с флудом"></a>
<h2>Борьба с флудом</h2>
<p>Приведу несколько команд, которые могут помочь при флуде твоего хоста.</p>
</p>Подсчет количества коннектов на определенный порт:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ netstat -na | grep ":порт\ " | wc -l</pre></div>
<p>Подсчет числа «полуоткрытых» TCP-соединений:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ netstat -na | grep ":порт\ " | grep SYN_RCVD | wc -l</pre></div>
<p>Просмотр списка IP-адресов, с которых идут запросы на подключение:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">$ netstat -na | grep ":порт\ " | sort | uniq -c | sort -nr | less</pre></div>
<p>Анализ подозрительных пакетов с помощью tcpdump:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># tcpdump -n -i eth0 -s 0 -w output.txt dst port порт and host IP-сервера</pre></div>
<p>Дропаем подключения атакующего:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># iptables -A INPUT -s IP-атакующего -p tcp --destination-port порт -j DROP</pre></div>
<p>Ограничиваем максимальное число «полуоткрытых» соединений с одного IP к конкретному порту:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># iptables -I INPUT -p tcp --syn --dport порт -m iplimit --iplimit-above 10 -j DROP</pre></div>
<p>Отключаем ответы на запросы ICMP ECHO:</p>
<div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"># iptables -A INPUT -p icmp -j DROP --icmp-type 8</pre></div>
<br/>
<a name="Выводы"></a>
<h2>Выводы</h2>
<p>Вот и все. Не вдаваясь в детали и без необходимости изучения мануалов мы создали Linux-box, который защищен от вторжения извне, от руткитов и прочей заразы, от непосредственно вмешательства человека, от перехвата трафика и слежки. Остается лишь регулярно обновлять систему, запретить парольный вход по SSH, убрать лишние сервисы и не допускать ошибок конфигурирования.</p>Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-22540484902538348552016-09-06T14:25:00.001+03:002017-08-03T16:06:07.523+03:00Раскладывание книжек по полкам в Kobo<i></i><br />
<br />
<i>Version 0.9 build 2016-09-06</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img hspace="15" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC29DBCRsTImkSv-oRxlVEsWjOK8AAFHhqHNage4S2ldxmnNvVxFcz7R2iuBBpp9f6j5p0yFkqUbHjSMBOcTZYWpTEwIXLAI-HDLUtwFFPkNsmNGSLe1aroCL-qDwtserm3XPQlwkkuK1G/s1600/kobo-books-apk-1425615533.png" style="float: left; height: 120px; width: 120px;" vspace="5" /></div>
Наверное самая глупая фишка в ридерах от Kobo - это так называемые книжные полки.
Единственное преимущество перед хранением книг в директориях - возможность поместить книгу сразу в две и более полок. Довольно сомнительная возможность.<br />
<br />
Я не использую Caliber и просто закидываю книги в ридер. Иногда раскладывал по полкам. Но после того, как полки несколько раз слетели, перестал это делать.
Как то мне ночью не спалось и я написал скрип на python, который раскладывает книги по полкам.<br />
<br />
<br />
<b>Как это работает.</b>
<br />
<br />
В основной памяти и на карточке я создал корневую директорию /Books. Внутри - отдельные директории для серий, в которые я копирую книги.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a data-fancybox="gallery" href="http://storage6.static.itmages.ru/i/16/0830/h_1472566358_5863197_b178b18e37.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="117" src="https://storage6.static.itmages.ru/i/16/0830/h_1472566358_5863197_b178b18e37.jpg" width="320" /></a></div>
<br />
Потом запускаю скрипт.<br />
Скрипт сначала очищает две таблицы: <i>Shelf</i> и <i>ShelfContent</i>.
Потом сканирует папку Books и записывает названия вложенных папок в <i>Shelf</i> и собственно книги в <i>ShelfContent</i>.<br />
<br />
Внутренние алгоритмы ридера работают по другому.<br />
Они ничего из базы не удаляют, а ставят пометку, что книга удалена. Вероятно это делается для сбора статистики и передается на сайт производителя, чтоб лучше нам впаривать книжки.<br />
Но это мои догадки.<br />
Мне это было делать лениво и я по простому очищаю указанные таблицы.
Извините, если что не так.<br />
Вложенные директории не проверял. К тому же, считаю смысла в них нет. Название полки не поместится на экран ридера.
Собственно и все.
<br />
<br />
<br />
<b>Установка Python</b><br />
<br />
Для работы скрипта необходимо, что бы на вашем компьютере был установлен Pyton 3.<br />
<br />
Если у Вас Ubuntu, nо Python 3.5 уже скорее всего установлен.
В противном случае выполните команду:
<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">sudo add-apt-repository ppa:fkrull/deadsnakes
sudo apt-get update
sudo apt-get install python3.5
</pre></div>
<br />
Если у Вас Windows, то установите Python 3.5.2 - 2016-06-27 отсюда:<br />
<a href="https://www.python.org/downloads/windows/">https://www.python.org/downloads/windows/</a><br />
<br />
<br />
<b>Как использовать.</b><br />
<ol>
<li>Сохраните <url https:="" master="" oboshelf.py="" oboshelfes="" raw.githubusercontent.com="" xa-ru="">скрипт</url> в файл KoboShelf.py и дайте ему права на исполнение:
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">chmod +x KoboShelf.py
</pre></div>
</li>
<li>В каталоге .kobo в разделе KOBOeReader <u>сделайте резервную копию базы данных</u>.
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">cp KoboReader.sqlite KoboReader.sqlite.origin
</pre></div></li>
<li>Создайте папку /Books на карточке, в ней папки с сериями, в них скопируйте ваши книги.</li>
<li>Запустите из терминала вышеуказанный скрипт. В терминале будут показаны найденные полки и книги, которые в них добавлены.<br />
Скрипт отрабатывает очень быстро, около секунды.</li>
<li>Безопасно извлеките ридер.</li>
</ol>
<br />
<b>Командная Строка</b><br />
<br />
В Linux и в Windows скрипт автоматически определяет точки монтирования Kobo и SD карты. Поэтому для создания полок никакие аргументы в команде запуска не нужны.<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">./KoboShelf.py -h
usage: KoboShelf.py [-h] [--onboard ONBOARD] [--sd SD] [--onboard_sw {on,off}]
[--sd_sw {on,off}] [-s] [-v]
optional arguments:
-h, --help show this help message and exit
--onboard ONBOARD eReaders mount point
--sd SD SD cards mount point
--onboard_sw <span style="color: #666666">{</span>on,off<span style="color: #666666">}</span>
Enabling/disabling adding book from eReader onboard
memory. Enabled by default
--sd_sw <span style="color: #666666">{</span>on,off<span style="color: #666666">}</span> Enabling/disabling adding book from SD card memory.
Enabled if SD card present
-s, --showsettings Display settings and exit. Reader must be connected.
-v, --version show program's version number and exit
</pre></div>
<br />
<br />
<b>Какие могут быть траблы.</b><br />
<br />
Скрипт в стадии экспериментальной, поэтому возможно все.
Если по какой то причине испортилась база данных KoboReader.sqlite, то восстанавливаем ее из сохраненной копии.<br />
Как всегда, все вы выполняете на свой страх и риск. Я ни за что не отвечаю.
<br />
<br />
<b>Исходный код можно посмотреть в Git репозитории:</b><br />
<br />
<a href="https://github.com/Axa-Ru/KoboShelfes/blob/master/KoboShelf.py">https://github.com/Axa-Ru/KoboShelfes/blob/master/KoboShelf.py</a><br />
<br />
В скрипте меняйте, что хотите, хоть автора, хоть код. :P<br />
<br />
Всем удачи.Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-16636585779938051202016-08-17T10:05:00.001+03:002017-08-02T08:45:40.016+03:00VMWare 12.1.1. на ядре 4.6.4 и 4.7<div class="separator" style="clear: both; text-align: center;"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw5HHn-7vux_Rn0LErx9VWRX7LApjRgbGOPUGW2Kyl7nNt4knCBzPz1jM2UPtw0R0tr7tKb7j5juSrNn6xlkCFZSgSYOOK1l8X7RpwNzce44RWmOK3P3HtaSIdjrjtuHpTXydGKkvyn0hf/s320/vmware_machines_by_harrunio-128.png" hspace="15" vspace="5" style="float: left; height: 70px; width: 70px;" /></div> <br/>
Для запуска VMWare на Ubuntu 16.04 на ядрах выше 4.2 необходимо пропатчить ядро.<br/>
Для 4.6.4 нашел в сети вот этот патч<br/>
<br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">
#!/bin/bash
usr=`whoami`
if [ "$usr" != "root" ]; then
echo "Run $0 ar superuser"
exit 1
fi
WORKDIR=/tmp/vmw
SRCDIR=/usr/lib/vmware/modules/source
MODDIR=/lib/modules/`uname -r`/kernel/misc
mkdir $WORKDIR
mkdir $MODDIR
cp $SRCDIR/vmmon.tar $WORKDIR/
cp $SRCDIR/vmnet.tar $WORKDIR/
cd $WORKDIR
tar -xf vmmon.tar
tar -xf vmnet.tar
cd vmnet-only
# cat netif.c | sed -r 's/dev->trans_start = jiffies/netif_trans_update(dev)/g' > netif.c1
# mv netif.c1 netif.c
cat userif.c | sed -r 's/get_user_pages/get_user_pages_remote/g' > userif.c1
mv userif.c1 userif.c
make
cp *.ko $MODDIR/
cd ../vmmon-only/linux
cat hostif.c | sed -r 's/get_user_pages/get_user_pages_remote/g' > hostif.c1
mv hostif.c1 hostif.c
cd ../
make
cp *.ko $MODDIR/
depmod -a
modprobe vmnet
modprobe vmmon
rm -R $WORKDIR
</pre></div>
Скрипт сохранить в любой каталог, дать права на исполнение и запустить под root.<br/>
Для ядер 4.6.7 этот патч не работает.<br/>
<br/>
Для ядра 4.7 запускаем этот патч:
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">
#!/bin/bash
usr=`whoami`
if [ "$usr" != "root" ]; then
echo "Run $0 ar superuser"
exit 1
fi
WORKDIR=/tmp/vmw
SRCDIR=/usr/lib/vmware/modules/source
MODDIR=/lib/modules/`uname -r`/kernel/misc
mkdir $WORKDIR
mkdir $MODDIR
cp $SRCDIR/vmmon.tar $WORKDIR/
cp $SRCDIR/vmnet.tar $WORKDIR/
cd $WORKDIR
tar -xf vmmon.tar
tar -xf vmnet.tar
cd vmnet-only
cat netif.c | sed -r 's/dev->trans_start = jiffies/netif_trans_update(dev)/g' > netif.c1
mv netif.c1 netif.c
cat userif.c | sed -r 's/get_user_pages/get_user_pages_remote/g' > userif.c1
mv userif.c1 userif.c
make
cp *.ko $MODDIR/
cd ../vmmon-only/linux
cat hostif.c | sed -r 's/get_user_pages/get_user_pages_remote/g' > hostif.c1
mv hostif.c1 hostif.c
cd ../
make
cp *.ko $MODDIR/
depmod -a
modprobe vmnet
modprobe vmmon
rm -R $WORKDIR
</pre></div>
Ветка <a href="http://rutracker.org/forum/viewtopic.php?t=5067105">обсуждения на rutracker</a>.Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-33129522823550943312016-03-25T09:23:00.000+03:002016-03-25T15:38:06.754+03:00Установка Transmission 2.92 в Thecus NAS<div class="separator" style="clear: both; text-align: center;"><img src="http://storage4.static.itmages.ru/i/16/0325/h_1458909119_6441094_93411ee270.png" hspace="15" vspace="5" style="float: left; height: 70px; width: 70px;" /></div>Вышла новая версия демона торрент клиента Transmission под номером 2.94.<br/>
Предыдущий релиз 2.90 был скомпрометирован тем, что в сборке под MacOS X был обнаружен вирус вымогатель.
Этому было посвящено недавнее <a href="https://forum.transmissionbt.com/viewtopic.php?t=17834">обсуждение на форуме tansmission</a><br/>
Про сборки под другие ОС информации нет, но на всякий случай я бы их удалил.<br/>
Разработчики сразу выпустили версию 2.92.<br/>
<br/>
Скачать: <a href="http://forum.thecus.com/viewtopic.php?f=36&t=10107">transmission for Thecus N4800eco</a>.<br/>
<br/>
После установки нужно поправить файл конфигурации. У меня на Thecus N4800eco он находится здесь:<br/>
/raid0/data/MOD_CONFIG/transmission/settings.json
Нужно прописать пути закачки:
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"> <span style="color: #8B008B; font-weight: bold">"download-dir"</span>: <span style="color: #CD5555">"/raid/Nas4d0/transmission"</span>,
<span style="color: #8B008B; font-weight: bold">"incomplete-dir"</span>: <span style="color: #CD5555">"/raid/Nas4d0/transmission/00_incomplete"</span>,
</pre></div>
и белый список ip адресов с которых разрешен вход на transmission:
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"> <span style="color: #8B008B; font-weight: bold">"download-dir"</span>: <span style="color: #CD5555">"/raid/Nas4d0/transmission"</span>,
<span style="color: #8B008B; font-weight: bold">"incomplete-dir"</span>: <span style="color: #CD5555">"/raid/Nas4d0/transmission/00_incomplete"</span>,
</pre></div>
Полностью конфиг выглядит так:
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">{
<span style="color: #8B008B; font-weight: bold">"alt-speed-down"</span>: <span style="color: #B452CD">1000</span>,
<span style="color: #8B008B; font-weight: bold">"alt-speed-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"alt-speed-time-begin"</span>: <span style="color: #B452CD">540</span>,
<span style="color: #8B008B; font-weight: bold">"alt-speed-time-day"</span>: <span style="color: #B452CD">62</span>,
<span style="color: #8B008B; font-weight: bold">"alt-speed-time-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"alt-speed-time-end"</span>: <span style="color: #B452CD">1020</span>,
<span style="color: #8B008B; font-weight: bold">"alt-speed-up"</span>: <span style="color: #B452CD">300</span>,
<span style="color: #8B008B; font-weight: bold">"bind-address-ipv4"</span>: <span style="color: #CD5555">"0.0.0.0"</span>,
<span style="color: #8B008B; font-weight: bold">"bind-address-ipv6"</span>: <span style="color: #CD5555">"::"</span>,
<span style="color: #8B008B; font-weight: bold">"blocklist-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"blocklist-url"</span>: <span style="color: #CD5555">"http://list.iblocklist.com/?list=mcvxsnihddgutbjfbghy&fileformat=p2p&archiveformat=gz"</span>,
<span style="color: #8B008B; font-weight: bold">"cache-size-mb"</span>: <span style="color: #B452CD">4</span>,
<span style="color: #8B008B; font-weight: bold">"dht-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"download-dir"</span>: <span style="color: #CD5555">"/raid/Nas4d0/transmission"</span>,
<span style="color: #8B008B; font-weight: bold">"download-queue-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"download-queue-size"</span>: <span style="color: #B452CD">5</span>,
<span style="color: #8B008B; font-weight: bold">"encryption"</span>: <span style="color: #B452CD">1</span>,
<span style="color: #8B008B; font-weight: bold">"idle-seeding-limit"</span>: <span style="color: #B452CD">30</span>,
<span style="color: #8B008B; font-weight: bold">"idle-seeding-limit-enabled"</span>: <span style="color: #8B008B; font-weight: bold">false</span>,
<span style="color: #8B008B; font-weight: bold">"incomplete-dir"</span>: <span style="color: #CD5555">"/raid/Nas4d0/transmission/00_incomplete"</span>,
<span style="color: #8B008B; font-weight: bold">"incomplete-dir-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"lpd-enabled"</span>: <span style="color: #8B008B; font-weight: bold">false</span>,
<span style="color: #8B008B; font-weight: bold">"message-level"</span>: <span style="color: #B452CD">2</span>,
<span style="color: #8B008B; font-weight: bold">"peer-congestion-algorithm"</span>: <span style="color: #CD5555">""</span>,
<span style="color: #8B008B; font-weight: bold">"peer-id-ttl-hours"</span>: <span style="color: #B452CD">6</span>,
<span style="color: #8B008B; font-weight: bold">"peer-limit-global"</span>: <span style="color: #B452CD">200</span>,
<span style="color: #8B008B; font-weight: bold">"peer-limit-per-torrent"</span>: <span style="color: #B452CD">50</span>,
<span style="color: #8B008B; font-weight: bold">"peer-port"</span>: <span style="color: #B452CD">51413</span>,
<span style="color: #8B008B; font-weight: bold">"peer-port-random-high"</span>: <span style="color: #B452CD">65535</span>,
<span style="color: #8B008B; font-weight: bold">"peer-port-random-low"</span>: <span style="color: #B452CD">49152</span>,
<span style="color: #8B008B; font-weight: bold">"peer-port-random-on-start"</span>: <span style="color: #8B008B; font-weight: bold">false</span>,
<span style="color: #8B008B; font-weight: bold">"peer-socket-tos"</span>: <span style="color: #CD5555">"default"</span>,
<span style="color: #8B008B; font-weight: bold">"pex-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"port-forwarding-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"preallocation"</span>: <span style="color: #B452CD">1</span>,
<span style="color: #8B008B; font-weight: bold">"prefetch-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"queue-stalled-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"queue-stalled-minutes"</span>: <span style="color: #B452CD">30</span>,
<span style="color: #8B008B; font-weight: bold">"ratio-limit"</span>: <span style="color: #B452CD">2</span>,
<span style="color: #8B008B; font-weight: bold">"ratio-limit-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"rename-partial-files"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-authentication-required"</span>: <span style="color: #8B008B; font-weight: bold">false</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-bind-address"</span>: <span style="color: #CD5555">"0.0.0.0"</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-password"</span>: <span style="color: #CD5555">"{278f607764923e503ac7c3b8c1f88890db4e2e63nBqhB/sz"</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-port"</span>: <span style="color: #B452CD">9091</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-url"</span>: <span style="color: #CD5555">"/transmission/"</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-username"</span>: <span style="color: #CD5555">""</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-whitelist"</span>: <span style="color: #CD5555">"127.0.0.1 192.168.1.*"</span>,
<span style="color: #8B008B; font-weight: bold">"rpc-whitelist-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"scrape-paused-torrents-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"script-torrent-done-enabled"</span>: <span style="color: #8B008B; font-weight: bold">false</span>,
<span style="color: #8B008B; font-weight: bold">"script-torrent-done-filename"</span>: <span style="color: #CD5555">""</span>,
<span style="color: #8B008B; font-weight: bold">"seed-queue-enabled"</span>: <span style="color: #8B008B; font-weight: bold">false</span>,
<span style="color: #8B008B; font-weight: bold">"seed-queue-size"</span>: <span style="color: #B452CD">10</span>,
<span style="color: #8B008B; font-weight: bold">"speed-limit-down"</span>: <span style="color: #B452CD">200</span>,
<span style="color: #8B008B; font-weight: bold">"speed-limit-down-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"speed-limit-up"</span>: <span style="color: #B452CD">100</span>,
<span style="color: #8B008B; font-weight: bold">"speed-limit-up-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"start-added-torrents"</span>: <span style="color: #8B008B; font-weight: bold">true</span>,
<span style="color: #8B008B; font-weight: bold">"trash-original-torrent-files"</span>: <span style="color: #8B008B; font-weight: bold">false</span>,
<span style="color: #8B008B; font-weight: bold">"umask"</span>: <span style="color: #B452CD">18</span>,
<span style="color: #8B008B; font-weight: bold">"upload-slots-per-torrent"</span>: <span style="color: #B452CD">14</span>,
<span style="color: #8B008B; font-weight: bold">"utp-enabled"</span>: <span style="color: #8B008B; font-weight: bold">true</span>
}
</pre></div>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-80378693624387023472016-03-01T01:42:00.003+03:002016-03-30T11:32:30.588+03:00Устанавливаем PyQt в Ubuntu<div class="separator" style="clear: both; text-align: center;"><img src="http://storage8.static.itmages.ru/i/16/0325/h_1458909761_1985817_52d933854e.png" hspace="15" vspace="5" style="float: left; height: 70px; width: 70px;" /></div>Если вы не знаете, что такое PyQt то отправлю Вас в <a href="https://ru.wikipedia.org/wiki/PyQt">википедию</a>. Там все коротко и по существу.<br/>
Если Вы не знаете, что такое Python, то может и к лучшему. Ну, или опять в <a href="https://ru.wikipedia.org/wiki/Python">википедию</a>.<br/>
<br/>
Вернулись?<br/>
Ну тогда вперед!<br/>
<br/>
Сначала подготовим место, где будем проводить работу с пакетами. Я обычно делаю это в директории ~/tmp<br/>
<br/>
Устанавливаем пакеты, необходимые для установки и работы PyQt<br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">sudo apt-get install build-essential python3-dev python3-pyqt5 pyqt5-dev-tools
</pre></div>
<br/>
Скачиваем и устанавливаем <a href="https://riverbankcomputing.com/software/sip/download">SIP</a><br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.17/sip-4.17.tar.gz
tar -xzf sip-4.17.tar.gz
<span style="color: #658b00">cd </span>sip-4.17
sudo python3 configure.py
make
sudo make install
</pre></div>
<br/>
Скачиваем и устанавливаем <a href="https://riverbankcomputing.com/software/pyqt/download5">PyQT5</a><br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">wget http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.5.1/PyQt-gpl-5.5.1.tar.gz
tar -xzf PyQt-gpl-5.5.1.tar.gz
<span style="color: #658b00">cd </span>PyQt-gpl-5.5.1
sudo python3 configure.py
sudo make
sudo make install
</pre></div>
<br/>
Вот и все. Установка завершена.<br/>
Теперь для проверки создадим небольшую программу на Python. Назовем ее pyqt_test.py<br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #228B22">#!/usr/bin/python3</span>
<span style="color: #228B22"># -*- coding: utf-8 -*-</span>
<span style="color: #8B008B; font-weight: bold">import</span> <span style="color: #008b45; text-decoration: underline">sys</span>
<span style="color: #8B008B; font-weight: bold">from</span> <span style="color: #008b45; text-decoration: underline">PyQt5.QtWidgets</span> <span style="color: #8B008B; font-weight: bold">import</span> QApplication, QWidget
<span style="color: #8B008B; font-weight: bold">if</span> __name__ == <span style="color: #CD5555">'__main__'</span>:
app = QApplication(sys.argv)
w = QWidget()
w.resize(<span style="color: #B452CD">250</span>, <span style="color: #B452CD">150</span>)
w.move(<span style="color: #B452CD">300</span>, <span style="color: #B452CD">300</span>)
w.setWindowTitle(<span style="color: #CD5555">'PyQT установлен'</span>)
w.show()
sys.exit(app.exec_())
</pre></div>
<br/>
Дадим файлу pyqt_test.py права на исполнение и запустим:<br/>
<br/>
<!-- HTML generated using hilite.me --><div style="background: #eeeedd; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">chmod +x pyqt_test.py
./pyqt_test.py
</pre></div>
<br/>
Если мы увидим такой результат, то это значит, что мы все сделали правильно и установили PyQt.<br/>
<br/>
<div class="separator" style="clear: both; text-align: center;"><a imageanchor="1" style="margin-left: 1em; margin-right: 1em; height: 150px; width: 150px;"><img border="0" src="http://storage5.static.itmages.ru/i/16/0325/h_1458911140_2152523_eabe5ac096.jpg" /></a></div>
<br/>
<br/>
<img style="float:left; margin:0 2px 2px 0;width: 15px; height: 15px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1vWbwZ84iH5fS9nfWMqtNqk4_FAVsiG4wb2yJPOt2K0G5ahg1yFxVC1uxaffJxJyaPSjxNhw1imlDz5jXYzED_UcTwNyZat0x1GgRYjGWMmkugBGcyY4SGygtp7ULEAv_Uescf7Bfaoaw/s320/notification-network-wireless.png"><b>Полезные ссылки:</b><br />
<ul>
<li><a target="_new" href="http://pythonworld.ru/gui/pyqt5-firstprograms.html">PyQt5: первые программы</a>
</li>
<li><a href="http://pyqt.sourceforge.net/Docs/PyQt5/">PyQt5 Reference Guide</a>
</li>
<li><a target="_new" href="http://pyqt.sourceforge.net/Docs/PyQt4/classes.html">PyQt Class Reference</a>
</li>
<li><a href="http://nullege.com/codes/search/PyQt5">Примеры использования классов PyQt5</a>
</li>
<li>Книга <a target="_new" href="https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=12&ved=0ahUKEwjrtrj8mdbLAhWJj3IKHfvbCAsQFghlMAs&url=https%3A%2F%2Fwww.cs.washington.edu%2Fresearch%2Fprojects%2Furbansim%2Fbooks%2Fpyqt-book.pdf&usg=AFQjCNFtsqXYpO4VrL2ZFIEqPRDbWsdfTQ&sig2=3U29q4VuO-schDJVQjHPWQ">Rapid GUI Programming with Python and Qt.</a>
</li>
<li>Статьи на Хабре <a target="_new" href="https://habrahabr.ru/search/?q=[pyqt4]&target_type=posts">Программирование на PyQt4</a>
</li>
<li><a target="_new" href="https://www.google.ru/search?num=30&newwindow=1&safe=off&biw=1383&bih=869&q=Python+3+%D0%B8+PyQt.+%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0+%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&oq=Python+3+%D0%B8+PyQt.+%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0+%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&gs_l=serp.3..0i19j0i22i30i19l7.79572.85272.0.86388.18.13.0.0.0.0.209.1370.10j2j1.13.0....0...1c.1.64.serp..8.4.552.giX9eGJmju8">Python 3 и PyQt. Разработка приложений.</a>
</li>
</ul>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-37090312470836930282015-12-17T01:00:00.001+03:002018-01-18T17:58:50.023+03:00Система видеонаблюдения для входной двери. 2. Купольная камера на лестничной площадке.Для получения качественной картинки было решено установить купольную камеру на лестничной площадке. Для этой цели очень давно, больше года назад, я купил камеру ITP-020RT45N. <s>Кто ее производит мне неизвестно.</s> Производит ее мне неизвестная компания с название IIT. <a href="http://dahuablr.jimdo.com/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B-1/iit-ip-%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D1%8B/itp-020rt45n/">Продают</a> эти камеры в основном в Беларусии.<br />
<br />
<table>
<tbody>
<tr>
<td rowspan="13"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheu1INaakaDr4cNTNNTCfDsB8m0ZAsTYYvLJPcXsbBfEFdCowD9x6pgwghHju2aqA89ZFWQAq8SR7d3SsXm7XoSBs3mXPiRZHK6kJOeHQjjz8xMv3-Ni2G5j0hLKcEoMZJEfSrzOswDS4Q/s320/%25D0%259A%25D0%25B0%25D0%25BC%25D0%25B5%25D1%2580%25D0%25B0-%25D0%25B2%25D0%25B8%25D0%25B4%25D0%25B5%25D0%25BE%25D0%25BD%25D0%25B0%25D0%25B1%25D0%25BB%25D1%258E%25D0%25B4%25D0%25B5%25D0%25BD%25D0%25B8%25D1%258F-ITP-013RT45H.jpg" width="320" /></td>
<td style="width: 150px;">Сенсор:</td> <td>1/2.8" SONY 2.4 CMOS</td>
</tr>
<tr>
<td style="width: 150px;">Firmware ver.:</td> <td>DM368+IMX222_3.0.9.0</td>
</tr>
<tr>
<td style="width: 150px;">Software ver.:</td> <td>4.1.0.20</td>
</tr>
<tr>
<td style="width: 150px;">Разрешение:</td> <td>1080P (1920×1080), 720P (1280x720)</td>
</tr>
<tr>
<td style="width: 150px;">Линза:</td> <td>2.8 - 12 мм</td>
</tr>
<tr>
<td style="width: 150px;">Чувствительность:</td> <td>0,01 Люкс</td>
</tr>
<tr>
<td style="width: 150px;">Отношение сигнал/шум:</td> <td>>50дБ</td>
</tr>
<tr>
<td style="width: 150px;">Рабочее расстояние ИК подсветки:</td> <td>20M</td>
</tr>
<tr>
<td style="width: 150px;">Интерфейс:</td> <td>RJ45 Ethernet</td>
</tr>
<tr>
<td style="width: 150px;">Питание:</td> <td>DC 12V/1000MA</td>
</tr>
<tr>
<td style="width: 150px;">Диапазон температур:</td> <td>-20 ~ 50°C</td>
</tr>
<tr>
<td style="width: 150px;">Защищенность:</td> <td>IP65</td>
</tr>
<tr>
<td style="width: 150px;">Размеры:</td> <td>149 x 99(В)мм</td>
</tr>
</tbody></table>
<br />
<table>
<tbody>
<tr>
<td><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfX-93cLUM5y4uc_BiuBfRRs2RHHsbdz4NZBVQZIhlUSzm5GS-gaYbKToTbKTF36YflSpJMoPQcn8w1ncI0oRWM5p5HVrH6-Ex8jsiYpBLsaJJiji9h784AOFMflMduTG5h_4UrSvSiaJM/s1600/Selection_079.jpg" imageanchor="1" style="margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfX-93cLUM5y4uc_BiuBfRRs2RHHsbdz4NZBVQZIhlUSzm5GS-gaYbKToTbKTF36YflSpJMoPQcn8w1ncI0oRWM5p5HVrH6-Ex8jsiYpBLsaJJiji9h784AOFMflMduTG5h_4UrSvSiaJM/s320/Selection_079.jpg" /></a></td>
<td>Интерфейс управления камерой привязан к Windows IE c active X.</td>
</tr>
</tbody></table>
<table>
<tbody>
<tr>
<td><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaRDjLH1cyE7GsiQt1HA1oVFBghtCsF_mNtxNzwvBzln_l_8rafgRGt_DeGIivjdSb0iqj3tJsCACSvFLDU5PbudGv2eoQRjLi5Qhy_gv3n5U5ogYDvrAfMnIKaOAYU5aeKV-8Zw52dIim/s1920/Screenshot+from+2015-12-17+22%253A42%253A53.png" imageanchor="1" style="margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaRDjLH1cyE7GsiQt1HA1oVFBghtCsF_mNtxNzwvBzln_l_8rafgRGt_DeGIivjdSb0iqj3tJsCACSvFLDU5PbudGv2eoQRjLi5Qhy_gv3n5U5ogYDvrAfMnIKaOAYU5aeKV-8Zw52dIim/s320/Screenshot+from+2015-12-17+22%253A42%253A53.png" /></a></td>
<td>Разрешение камеры действительно высокое. Но шум тоже великоват (возможно это мои придирки).
Скриншот с камеры при нормальном уровне освещенности. Тестовый лист находится на расстоянии около 3,5 метров от камеры.</td>
</tr>
</tbody></table><br /><br />
Видео при хорошей освещенности. К сожалению, пришлось уменьшить размер и соответственно уменьшилось разрешение.<br />
Если с RVi-R04La White я снимал поток rtsp с помощью totem, то с камерой он работать отказался и для трансляции я использовал vlc: <br />
<br />
<i>vlc "rtsp://user:password@192.168.1.14/0"</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='960' height='615' src='https://www.blogger.com/video.g?token=AD6v5dyE4wuPHy_s-IfD0NckBpEaWcD9raNEwmKY8G-kIpNad3NR2o7kiohrKab7l942-sJpmLWBcmFZpCUwSxe3' class='b-hbp-video b-uploaded' frameborder='0'></iframe><span id="transmark"></span></div>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com1tag:blogger.com,1999:blog-3966048831613183164.post-43511795516482006262015-12-16T15:49:00.001+03:002018-01-18T17:59:17.606+03:00Система видеонаблюдения для входной двери. 1. Глазок.Год назад я озадачился поставить вместо дверного глазка видеокамеру.<br />
<br />
Собственно видеокамера продающаяся на Ali меня толкнула на такую поделку. Прикупил я безымянный глазок <a href="http://ru.aliexpress.com/item/mini-Door-Eye-Hole-1-3-Color-CMOS-PC1089-600TVL-PEEPHOLE-DOORVIEW-mirror-color-camera-170/1731976298.html?detailNewVersion=2">CMOS PC1089 800TVL PEEPHOLE DOORVIEW</a> и систему записи <a href="http://infovideo.ru/htm/RVi-R04LA%20white.htm">RVi-H04La</a>.<br />
<br />
<table>
<tbody>
<tr>
<td><img border="0" height="320" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIAxcYVl3dI-4vc22jfoHqbli6SHki8XUMCQSb4kkqP3rxsNeFzLcXIOgRXeKdjqKjNBVl-Dm3Ixt4GF0l0QPPDDsTff-0ArZoyzNxQvtdBDr0btcvzI_TUdkNVBpkH1iUaBiuQtRcpjtq/s400/mini-door-eye-hole-1-3-color-cmos-pc1089.jpg" /></td>
<td>Сначала про камеру.<br />
<br />
Внешне выглядит довольно качественно. Черненный алюминиевый корпус. Система линз, дающая широкий угол обзора, как у обычного дверного глазка.<br />
Камера является аналоговой и имеет два разъёма подключения: питание 12 В и выход видео.<br />
Продавец утверждал, что камера имеет разрешение 800 TVL.<br />
Регистратор выдает поток 960x576<br />
<br />
<i>Stream #0.0: Video: libx264, yuv420p, 960x576, q=-1--1, 25 tbn, 25 tbc</i><br />
<br />
Для тестирования я разместил перед камерой на расстоянии одного метра <a href="http://www.netlore.ru/files/Images/proverka_zreniya/7.jpg">тестовую таблицу</a>, напечатанную на листе А4, аналогичную той, что используется для проверки зрения. <br />
<br />
Видео записывал, подключившись к регистратору RVi-H04La следующей командой:<br />
<br />
<i>avconv -f rtsp -i "rtsp://user:password@192.168.1.12:554/cam/realmonitor?channel=1&subtype=0" -y "PC1089_800TVL_low_light.mp4"</i><br />
</td>
</tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: left;">
Дальше вы все можете видеть сами. Видеозаписи вписаны в окно размером 960х615<br />
В работе камера оказалась достаточно отвратной. при низком уровне освещения качество изображения неудовлетворительное. Огромный шум, который сводит на нет разрешение камеры:</div><br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='960' height='615' src='https://www.blogger.com/video.g?token=AD6v5dwON-Z59cqHRl8EPsGGWrQJzZ22k0619A3wAeWIzGVe-42Mgt2cK3aVUGxiEhE_tFOYPlOGzOUBwN2ltrIY6Q' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<br />
При свете показывает лучше.<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='960' height='615' src='https://www.blogger.com/video.g?token=AD6v5dytfnr2rWGhZT8ni4kyQBxtNYgkuQhN-3wh5TImiVhb8ejy9iTSShYGTmLy03fMy8PPJ5KUtGj-_h4a46-K9w' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<br />
<br />
Буду признателен, если кто подскажет, где можно взять более качественную камеру для дверного глазка.Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-3141993957176417162015-12-13T15:05:00.001+03:002017-08-03T16:15:03.019+03:00Настройка Ubuntu и dd-wrt для подключения к домашней сети по vpn.Зачастую бывает полезно подключиться к домашней локальной сети с работы. Например, чтобы скачать какой нибудь файл. Или сохранить какой нибудь файл. Или дать команду торрент серверу загрузить кино, чтобы вечером его посмотреть.<br />
Для этой цели очень удобно настроить на роутере vpn сервер. Делается это не просто, а очень просто.<br />
Оригинальное полное описание полей находится в <a href="http://www.dd-wrt.com/wiki/index.php/PPTP_Server_Configuration#PPTP_Server">wiki</a>
<b> </b><br />
<br />
<b>Настройка сервера</b><br />
Думаю, картинки достаточно для понимания.<br />
<br />
<table border="0">
<tbody>
<tr>
<td><a data-fancybox="gallery" href="http://storage2.static.itmages.ru/i/15/0129/h_1422511826_9291896_0b5590003a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://storage2.static.itmages.ru/i/15/0129/h_1422511826_9291896_0b5590003a.png" height="280" width="320" /></a></td>
<td align="left" valign="top">Нужно просто: <br />
<ol>
<li> включить pptp сервер </li>
<li>указать диапазон адресов из пула внутренней сети (192.168.1.180-182). В моем случае я разрешаю 3 одновременных коннекта. </li>
<li>придумать логин и пароль для входа и записать их в поле CHAP-Secrets </li>
<li>запомнить внешний ip адрес (в скриншоте для примера я нарисовал WAN IP: 1.2.3.4, у вас, естественно, будет другой) </li>
</ol>
</td></tr>
</tbody></table>
<br />
Я отключил шифрование указав в поле MPPE Encryption Disable, потому как с шифрованием у меня подключение на заработало. (В интернетах пишут, что на некоторых прошивках dd-wrt так бывает.<br />
Так же пишут, что это несовместимость реализации шифрования на стороне клиента Ubuntu <a href="http://pptpclient.sourceforge.net/howto-diagnosis.phtml#mppe_rbpnf">[1]</a> <a href="http://habrahabr.ru/post/56496/">[2]</a> <a href="http://www.dd-wrt.com/phpBB2/viewtopic.php?p=289&sid=1c1b97a7417eca7d75fbe41138c45319">[3]</a>).<br />
Поля <i>DNS1</i>, <i>DNS2</i>, <i>WINS1</i>, <i>WINS2</i> в нашем случае не нужны.<br />
В поле <i>Server IP</i> нужно указать адрес, который будет назначен виртуальному серверу. Я указал свободный в моей сети 192.168.1.2. Можно указать 0.0.0.0
<br />
<br />
<b>Настройка клиента</b><br />
На клиентской машине (Ubuntu 14.04) создаем vpn подключение (на скриншотах у меня уже присутствует настроенное соединение с именем Home VPN connection):<br />
<br />
<span id="transmark"></span>
<table border="0"><tbody>
<tr>
<td valign="top" width="220px">1. <br /><a data-fancybox="gallery" href="http://storage1.static.itmages.ru/i/15/0129/h_1422511249_3271722_9070835694.png" imageanchor="1" ><img border="0" src="http://storage1.static.itmages.ru/i/15/0129/h_1422511249_3271722_9070835694.png" width="200"/></a></td>
<td valign="top" width="220px">2. <br /><a data-fancybox="gallery" href="http://storage1.static.itmages.ru/i/15/0129/h_1422511413_3393652_c4be6d0bd7.png" imageanchor="1" ><img border="0" src="http://storage1.static.itmages.ru/i/15/0129/h_1422511413_3393652_c4be6d0bd7.png" width="200"/></a></td>
<td valign="top" width="220px">3. <br /><a data-fancybox="gallery" href="http://storage1.static.itmages.ru/i/15/0129/h_1422511626_4375467_457c010209.png" imageanchor="1" ><img border="0" src="http://storage1.static.itmages.ru/i/15/0129/h_1422511626_4375467_457c010209.png" width="200"/></a></td>
</tr>
<tr>
<td valign="top" width="220px">4. <br /><a data-fancybox="gallery" href="http://storage3.static.itmages.ru/i/15/0129/h_1422511915_8129828_6308454664.png" imageanchor="1" ><img border="0" src="http://storage3.static.itmages.ru/i/15/0129/h_1422511915_8129828_6308454664.png" width="200"/></a><br />
<br />
Указываем наш WAN IP: 1.2.3.4 (вместо 1.2.3.4 поставьте ваш реальный адрес) и логин-пароль</td>
<td valign="top" width="220px">5. <br /><a data-fancybox="gallery" href="http://storage1.static.itmages.ru/i/15/0129/h_1422511988_7228562_1917ea8366.png" imageanchor="1" ><img border="0" src="http://storage1.static.itmages.ru/i/15/0129/h_1422511988_7228562_1917ea8366.png" width="200"/></a></td>
<td></td>
</tr>
</tbody></table>
<br />
<br />
На этом настройка закончена.<br />
<br />
<table border="0">
<tbody>
<tr>
<td><a data-fancybox="gallery" href="http://storage4.static.itmages.ru/i/15/0129/h_1422534622_9678080_57f2655d8c.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://storage4.static.itmages.ru/i/15/0129/h_1422534622_9678080_57f2655d8c.png" height="320" width="278" /></a>
</td>
<td align="left" valign="top" width="300">Если что то пошло не так и не создается соединение, то можно посмотреть процесс установления соединения в реальном времени.<br />
Для этого открываем окно терминала и даем команду:<br />
<i>sudo tail -f /var/log/syslog</i></td>
</tr>
</tbody></table>
<b>Небольшое но важное дополнение.</b><br />
Если номера сеток где вы сейчас находитесь и домашней совпадают, то туннель работать не будет. Поэтому, чтобы снизить вероятность такого события выберите номер домашней сетки, который не используется в примерах и учебниках. Например 192.168.142.0.
<br />
<br />
<b>Скоростные показатели.</b><br />
Поскольку роутер имеет не очень мощный процессор скорость через туннель не превышает в моем случае 15 Mbps. Процессор при этом загружен полностью.
<br />
<table border="0">
<tbody>
<tr>
<td valign="top"><a data-fancybox="gallery" href="http://storage4.static.itmages.ru/i/15/0202/h_1422869681_6789534_314ae86062.png" imageanchor="1" ><img border="0" src="http://storage4.static.itmages.ru/i/15/0202/h_1422869681_6789534_314ae86062.png" width="200"/></a></td>
<td valign="top"><a data-fancybox="gallery" href="http://storage1.static.itmages.ru/i/15/0202/h_1422869949_7644747_da353293e8.png" imageanchor="1" ><img border="0" src="http://storage1.static.itmages.ru/i/15/0202/h_1422869949_7644747_da353293e8.png" width="200"/></a></td>
</tr>
</tbody></table><br />
<br />
<b>Напочитать для знаний:</b><br />
<a href="http://pptpclient.sourceforge.net/routing.phtml#client-to-server">PPTP Client. Routing HOWTO</a>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-66347451107115722622014-05-18T09:14:00.000+04:002017-08-03T16:23:23.873+03:00FTP сервер на Thecus n4800eco<br/>
Сейчас электронные копии всяких бумажек очень актуальны.<br/>
При получении визы, например, нужно прилагать скан паспорта. Или помогает очень сканы оплаты всяких штрафов за авто.
Для этих целей я храню сканы нужных мне документов на сервере.<br/>
<br/>
Для сканирования я использую сетевой <a href=http://www.brother.ru/g3v1/g3.cfm/s_page/92250/s_level/39720/s_product/MFC7840W/searchkey/7840w>MFC Brother 7840wr</a>, в котором настроил три профайла для отправки сканов на FTP сервер.<br/>
<a data-fancybox="gallery" href="http://storage6.static.itmages.ru/i/14/0518/h_1400388739_1791989_76810b709e.png"><img src="http://storage6.static.itmages.ru/i/14/0518/s_1400388739_1791989_76810b709e.png" /></a> <a data-fancybox="gallery" href="http://storage7.static.itmages.ru/i/14/0518/h_1400388803_1130177_957afef68a.png"><img src="http://storage7.static.itmages.ru/i/14/0518/s_1400388803_1130177_957afef68a.png" /></a><br/>
<br/>
На n4800eco я развернул FTP сервер <a href=http://www.pureftpd.org/project/pure-ftpd>pureFTPd</a><br/>
<a data-fancybox="gallery" href="http://storage7.static.itmages.ru/i/14/0518/h_1400389184_5496765_f1a0c832e1.png"><img src="http://storage7.static.itmages.ru/i/14/0518/s_1400389184_5496765_f1a0c832e1.png" /></a><br/>
<br/>
Для работы pureFTPd необходимо установить MySQL и PHP.<br/>
<a data-fancybox="gallery" href="http://storage9.static.itmages.ru/i/14/0518/h_1400389569_3521407_beed5eaacd.png"><img src="http://storage9.static.itmages.ru/i/14/0518/s_1400389569_3521407_beed5eaacd.png" /></a><br/>
<br/>
Теперь очень удобно. Я просто кладу нужный документ в сканер Brother 7840wr и выбираю качество скана. Все остальное происходит автоматически.Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-48389604044501350292014-03-15T14:22:00.003+04:002017-08-03T16:25:18.353+03:00Thecus N4800ecco - у меня новая свистоперделка.Заменил свой старенький <a href="http://www.trustedreviews.com/Netgear-ReadyNAS-Duo_Peripheral_review">NAS NetGear</a> на новый <a href="http://www.thecus.com/product.php?PROD_ID=83">Thecus N4800eco</a>.
Сейчас заливаю на него сохраненные файлы.
Работает в 20 раз быстрее, чем прежний
<div class="separator" style="clear: both; text-align: center;"><a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPtFzQCCTqlDCuv9K6l9mLzEaJpH3SjbdhRwOEKBBLO6shji0gHSnvCYBSeZe8OVgCOjfbyK8iOBL47wwkpwrAt8psV6xPZN0lWXRLmIOxgxA4gblEZv9NwalX0cplKahPRCxcTQ07f5Ed/s1600/mc+%5Baxa@X220%5D:-media-axa-Zalman-_iso_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPtFzQCCTqlDCuv9K6l9mLzEaJpH3SjbdhRwOEKBBLO6shji0gHSnvCYBSeZe8OVgCOjfbyK8iOBL47wwkpwrAt8psV6xPZN0lWXRLmIOxgxA4gblEZv9NwalX0cplKahPRCxcTQ07f5Ed/s320/mc+%5Baxa@X220%5D:-media-axa-Zalman-_iso_001.png" /></a></div>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-84618567871374262372013-12-07T11:48:00.000+04:002017-08-04T08:58:16.966+03:00Аудио книгиВ последнее время пристрастился я слушать аудио книги. Слушаю на сматрфоне <a href="http://www.lg.com/ru/optimus-g">LG Optimus G e975</a>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG4rkOf724KpyQK72ZRM564P3-bV55f1bJy7SoLNclR4mSCE7WCL2ZcsoRWTPqjRFSzjg9g8hOZEoASFG9Oq_1odS19hKyvn8jK3PlnHIL4FEuuw7eykHWjoJ7nXfjdJLLQQR5rav1DY_x/s600/lg_optimus_g.jpg" onclick="return hs.expand(this)"><img border="0" hspace="10" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG4rkOf724KpyQK72ZRM564P3-bV55f1bJy7SoLNclR4mSCE7WCL2ZcsoRWTPqjRFSzjg9g8hOZEoASFG9Oq_1odS19hKyvn8jK3PlnHIL4FEuuw7eykHWjoJ7nXfjdJLLQQR5rav1DY_x/s200/lg_optimus_g.jpg" style="float: left;" title="Кликни на картинку и она увеличится" vspace="3" width="200" /></a><br/>
<br/>
Слушаю с помощью программы <a href="https://play.google.com/store/apps/details?id=com.amblingbooks.bookplayerpersonal">Ambling BookPlayer</a>. Автор этой программы залег на дно, и уже не принимает советов и просьб по усовершенствованию программы (а у меня есть пара идеек). Зато GooglePlay уверенно принимает деньги за эту программу, чем я и воспользовался.<br/>
<br/>
Аудио книги почему то принято разбивать на огромное количество файлов. Даже если один файл - одна глава, все равно это как то надумано.
Мне почему то не нравится такая файло-помоечная структура. По крайней мере хранить этот бардак неудобно.<br/>
<br/>
Я написал на bash небольшую программку, которая объединяет эти файлы в один, а заодно создает XML файл для экспорта в bookreader.<br/>
Работает она из под наутилуса Ubuntu.
<pre class="brush: bash; toolbar: true;" >
#!/bin/bash
#----------------------------------------------------------------------
# Программа объеденения музыкальных файлов (книг)
# Для установки скопировать в папку
# ~/.local/share/nautilus/scripts
#----------------------------------------------------------------------
# --- Версионность ---
# Начальная версия
#VERSION=0.1
# улучшение алгоритмов кодирования
#VERSION=0.2
#VERSION=0.3
# Заполнение полей в соответствии с xml описанием для импорта в ambling book reader
#VERSION=0.4
# Добавлено переименование обложки в соответствии с названием книги.
#VERSION=0.41
# Баг. Обложка не конвертится. (fixed)
# Добавить полоску времени, а не пульсар (fixed)
#VERSION=0.42
# Добавлено управление битрейтом, генерацией Обложки, XML, результирующего файла (fixed)
VERSION=0.43
#----------------------------------------------------------------------
# Переменные и константы
ERROR=192
INPUT="concat:"
BITRATE="96k|32k|64k|128k|192k|256k"
MIN_BITRATE="96k|32k|64k|128k|192k|256k"
MAX_BITRATE="96k|32k|64k|128k|192k|256k"
CODEC="libvorbis"
CURENT_DIR=$(pwd)
IN_DURATION=0
CREATE_COVER=TRUE
CREATE_XML=TRUE
CREATE_ONEOGG=TRUE
#----------------------------------------------------------------------
# xml ambling bookplayer Tags
BOOK_NAME=""
AUTHOR_NAME=""
NARRATOR_NAME=""
PUBLISHER=""
COPYRIGHT=""
IMAGE_FILE_NAME=""
SERIES_NAME=""
SERIES_SEQUENCE=""
#----------------------------------------------------------------------
# audiofile Tags (атавизм, времени не было сделать ревизию)
TITLE=""
ARTIST=""
ALBUM_ARTIST=""
ALBUM=""
GENRE="AudioBook"
DATE=""
TRACK=""
PUBLISHER=""
ENCODED_BY=""
COPYRIGHT=""
COMPOSER=""
PERFORMER=""
DISC=""
ENCODER="ffmpeg"
COVER=""
check_installed()
{
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $1 |grep "install ok installed")
if [ "" == "$PKG_OK" ]; then
zenity --no-wrap --error --text="<b>$1</b> package not found!\n Install it"
exit $ERROR
fi
}
# Выход по ошибке
exit_on_error()
{
yad --title "Error" --text "$1" 200 200
exit 192
}
# Возвращает в секундах время звучания звукового файла
duration()
{
RET=$(ffmpeg -i "$1" 2>&1 | grep Duration | awk '{ print $2 }' | tr -d ',')
S=$(echo ${RET:0:2}*60*60+${RET:3:2}*60+${RET:6:2} | bc)
echo $S
}
check_nautilus_env()
{
#--------------------------------------------------------------------
# Сохраняем для отладки
echo "Аргументы командной строки запуска скрипта в Nautius" >> tst.txt
echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" >> tst.txt
echo "" >> tst.txt
if [ "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" == "" ]; then
echo "Этот скрипт запускается из под наутилуса"
exit_on_error
fi
}
#######################################################################
# Main code
#
#----------------------------------------------------------------------
check_nautilus_env
check_installed yad
check_installed python-mutagen
#----------------------------------------------------------------------
# Получаем имена тегов
AUTHOR_NAME=$(mid3iconv --encoding=Windows-1251 --dry-run --debug "$1" | grep TPE1 | sed 's/TPE1=//')
if [ "$AUTHOR_NAME" == "" ]; then
AUTHOR_NAME="$1"
fi
BOOK_NAME=$(mid3iconv --encoding=Windows-1251 --dry-run --debug "$1" | grep TIT2 | sed 's/TIT2=//')
if [ "$BOOK_NAME" == "" ]; then
BOOK_NAME="$1"
fi
SERIES_NAME="$BOOK_NAME"
TAGS=$(yad --geometry=400x200 --center\
--title="Enter Track Tags" \
--form --text="$CURENT_DIR" \
--field="Название Книги" \
--field="Автор Книги" \
--field="Название серии" \
--field="Номер книги в серии" \
--field="Читает" \
--field="Обложка:FL" \
--field="Конвертировать обложку:CHK" \
--field="Создавать XML:CHK" \
--field="Создавать ogg файл:CHK" \
--field="Средний битрейт:CB" \
--field="Минимальный битрейт:CB" \
--field="Максимальный битрейт:CB" \
--item-separator='|' \
"$BOOK_NAME" \
"$AUTHOR_NAME" \
"$SERIES_NAME" \
"$SERIES_SEQUENCE" \
"$NARRATOR_NAME" \
"$IMAGE_FILE_NAME" \
$CREATE_COVER \
$CREATE_XML \
$CREATE_ONEOGG \
$BITRATE \
$MIN_BITRATE \
$MAX_BITRATE \
--button="gtk-ok:0" --button="gtk-cancel:1")
if [[ $? -eq 1 ]]; then
# cancel button pressed
exit 192
fi
BOOK_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $1 }')
BOOK_NAME=$(echo "$BOOK_NAME" | tr '[ ]' '[_]')
AUTHOR_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $2 }')
AUTHOR_NAME=$(echo "$AUTHOR_NAME" | tr '[ ]' '[_]')
SERIES_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $3 }')
SERIES_NAME=$(echo "$SERIES_NAME" | tr '[ ]' '[_]')
SERIES_SEQUENCE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $4 }')
SERIES_SEQUENCE=$(echo "$SERIES_SEQUENCE" | tr '[ ]' '[_]')
NARRATOR_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $5 }')
NARRATOR_NAME=$(echo "$NARRATOR_NAME" | tr '[ ]' '[_]')
IMAGE_FILE_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $6 }')
IMAGE_FILE_NAME=$(basename $IMAGE_FILE_NAME)
CREATE_COVER=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $7 }')
CREATE_XML=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $8 }')
CREATE_ONEOGG=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $9 }')
BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $10 }')
MIN_BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $11 }')
MAX_BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $12 }')
BUTTON_OK=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $13 }')
BUTTON_CANSEL=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $14 }')
#----------------------------------------------------------------------
# Сохраняем для отладки
echo "RAW значения формы----------------------------------" > tst.txt
echo $TAGS >> tst.txt
echo "
Разобраные значения формы----------------------------------
BOOK_NAME: $BOOK_NAME
AUTHOR_NAME: $AUTHOR_NAME
SERIES_NAME: $SERIES_NAME
SERIES_SEQUENCE: $SERIES_SEQUENCE
NARRATOR_NAME: $NARRATOR_NAME
IMAGE_FILE_NAME: $IMAGE_FILE_NAME
" >> tst.txt
for arg
do
NF=$(echo "$arg" | tr '[ ]' '[_]')
INPUT=$INPUT"|$NF"
if [ ! "$arg" == "$NF" ];
then
if [ -e "$NF" ]; then
exit_on_error "$NF: File exist already.\n\nExiting."
fi
mv "$arg" "$NF";
fi
NF_DURATION=$(duration $NF)
IN_DURATION=$(( $IN_DURATION+$NF_DURATION ))
done
INPUT=$(echo "$INPUT" | sed 's/:|/:/')
FFMPEG_CMD="ffmpeg -i \"$INPUT\" \\
-maxrate $MAX_BITRATE -minrate $MIN_BITRATE -ab $BITRATE -acodec $CODEC \\
-metadata title=\"$BOOK_NAME\" \\
-metadata artist=\"$AUTHOR_NAME\" \\
-metadata genre=\"Audiobook\" \\
-metadata album_artist=\"$NARRATOR_NAME\" \\
-metadata album=\"$SERIES_NAME\" \\
-metadata date=\"$DATE\" \\
-metadata track=\"$SERIES_SEQUENCE\" \\
-metadata publisher=\"$PUBLISHER\" \\
-metadata encoded_by=\"$ENCODED_BY\" \\
-metadata copyright=\"$COPYRIGHT\" \\
-metadata composer=\"$COMPOSER\" \\
-metadata performer=\"$PERFORMER\" \\
-metadata disc=\"$DISC\" \\
-metadata encoder=\"$ENCODER\" \\
\"$AUTHOR_NAME-$BOOK_NAME.ogg\""
#----------------------------------------------------------------------
# Сохраняем для отладки
echo "--------------------------------"
echo "Время зввучания: $IN_DURATION сек." >> tst.txt
#----------------------------------------------------------------------
# Для отладки удобно эти команды скинуть в отдельные командные файлы
echo "#!/bin/bash" > ffmpeg_cmd.sh
echo "" >> ffmpeg_cmd.sh
echo "$FFMPEG_CMD" >> ffmpeg_cmd.sh
$(chmod +x ffmpeg_cmd.sh)
echo "#!/bin/bash" > cover_convert_cmd.sh
echo "" >> cover_convert_cmd.sh
echo "convert $IMAGE_FILE_NAME -resize 400x400 $AUTHOR_NAME-$BOOK_NAME.jpg">> cover_convert_cmd.sh
$(chmod +x cover_convert_cmd.sh)
#----------------------------------------------------------------------
# Сконвертируем обложку книги
if [ $CREATE_COVER == "TRUE" ]; then
RET=$(./cover_convert_cmd.sh)
fi
#----------------------------------------------------------------------
# Сгенерим xml описание книги
if [ $CREATE_XML == "TRUE" ]; then
echo "<audiobook>
<book_name>$BOOK_NAME</book_name>
<author_name>$AUTHOR_NAME</author_name>
<image_file_name>/sdcard/audiobooks/$AUTHOR_NAME-$BOOK_NAME.jpg</image_file_name>
<series_name>$SERIES_NAME</series_name>
<series_sequence>$SERIES_SEQUENCE</series_sequence>
<narrator_name>$NARRATOR_NAME</narrator_name>
<chapter>
<heading>$BOOK_NAME</heading>
<title></title>
</chapter>
<audio_file>
<file_name>/sdcard/audiobooks/$AUTHOR_NAME-$BOOK_NAME.ogg</file_name>
</audio_file>
</audiobook>" > $AUTHOR_NAME-$BOOK_NAME.xml
fi
#----------------------------------------------------------------------
# Собственно, запуск конвертирования
if [ $CREATE_ONEOGG == "TRUE" ]; then
touch /tmp/$$
( ( echo 1
while [ -f /tmp/$$ ]
do
sleep 10
# Вычисления процента сконвертированного
OUT_DURATION=$(duration "$AUTHOR_NAME-$BOOK_NAME.ogg")
PERCENTAGE=$(( OUT_DURATION*100/IN_DURATION))
echo $PERCENTAGE
done
echo 100 ) | yad --title "$CURENT_DIR" \
--progress \
--progress-text="$AUTHOR_NAME-$BOOK_NAME.ogg" \
--percent=0 --auto-close --no-buttons --width=300) &
RET=$(./ffmpeg_cmd.sh)
rm /tmp/$$
wait
fi
#----------------------------------------------------------------------
# Конец
yad --no-wrap \
--title "Конвертирование завершено" \
--text "$CURENT_DIR/$AUTHOR_NAME-$BOOK_NAME.ogg"
rm ./cover_convert_cmd.sh
rm ./ffmpeg_cmd.sh
rm ./tst.txt
</pre><br/>
<br/>
Если захотите ей воспользоваться, то сохрание ее в ~/.local/share/nautilus/scripts/merge_mp3.sh. После чего дайт права на исполнение следующей командой.
<pre class="brush: bash; toolbar: true;" >
chmod +x ~/.local/share/nautilus/scripts/merge_mp3.sh
</pre>
Кроме того необходимо установить пакеты <a href="http://www.webupd8.org/2010/12/yad-zenity-on-steroids-display.html">yad</a> и <a href="https://help.ubuntu.com/community/ConvertingMP3Tags">python-mutagen</a><br/>
<br/>
<div style="clear:left">
Пользоваться ей очень просто. Сначала в Nautilus выделяю файлы книги, которые хочу объединить.<br/>
<br/>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNMTFIPZGN-9LWb9_1UAsFLkFxlkJNgta1-ZhiO6BYzyB7MMEg07ZSfCtX9CmBabdSJD6DNrmACMuQzLE2ZefApfDNBco-8s0foRnM1EBK1wD7rnXvSv2MrEuT3VmrtluvUZu2_V8pvNbz/s600/merge_mp3_01.png" onclick="return hs.expand(this)"><img border="0" hspace="10" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNMTFIPZGN-9LWb9_1UAsFLkFxlkJNgta1-ZhiO6BYzyB7MMEg07ZSfCtX9CmBabdSJD6DNrmACMuQzLE2ZefApfDNBco-8s0foRnM1EBK1wD7rnXvSv2MrEuT3VmrtluvUZu2_V8pvNbz/s200/merge_mp3_01.png" style="float: left;" title="Кликни на картинку и она увеличится" vspace="3" width="200" /></a><br/>
<br/>
</div>
<div style="clear:left">
<br/>
Затем нажимаю правую кнопку и выбираю скрипт:<br/>
<br/>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhZFW297jt9Yp3cAmYFn85ScEdsy93g9FLpndw0LFSo7-Yg2ut5x2gGfVJGgcoY6MAwIO44sgK0CpJWbZtKBIyqH3rlLLvZIdudMmucIbdmSlRi0pLTpgBXJ-mAxdGB0_-a3dOjusf0e5y/s600/merge_mp3_02.png" onclick="return hs.expand(this)"><img border="0" hspace="10" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhZFW297jt9Yp3cAmYFn85ScEdsy93g9FLpndw0LFSo7-Yg2ut5x2gGfVJGgcoY6MAwIO44sgK0CpJWbZtKBIyqH3rlLLvZIdudMmucIbdmSlRi0pLTpgBXJ-mAxdGB0_-a3dOjusf0e5y/s200/merge_mp3_02.png" style="float: left;" title="Кликни на картинку и она увеличится" vspace="3" width="200" /></a><br/>
<br/>
</div>
<div style="clear:left">
<br/>
В появившемся окне заполняю поля, которые будут отображаться bookplayer<br/>
<br/>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDAN_zu5sQjWixUKCWg9Wf0sIx3oFBpqvWCGBxVtow5JI2Zz0phJdsq_uwVjzQPZPWHPnD0s3anh3w2FgoDN_V5TvBymmW_odU1aVzrAcxMOGylqPdz7HnLjJYnkgYMRX0oT4pIJVCP-YG/s600/merge_mp3_03.png" onclick="return hs.expand(this)"><img border="0" hspace="10" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDAN_zu5sQjWixUKCWg9Wf0sIx3oFBpqvWCGBxVtow5JI2Zz0phJdsq_uwVjzQPZPWHPnD0s3anh3w2FgoDN_V5TvBymmW_odU1aVzrAcxMOGylqPdz7HnLjJYnkgYMRX0oT4pIJVCP-YG/s200/merge_mp3_03.png" style="float: left;" title="Кликни на картинку и она увеличится" vspace="3" width="200" /></a><br/>
<br/>
</div>
<div style="clear:left">
<br/>
Наблюдаем за ходом конвертирования<br/>
<br/>
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhomDEqGsOwKH7ZqFwzQkN5SDSn8-PhjxuT3O8LUNIa-dYPy-CtUuKl0YUS30RbetXfypdZ64seLsUaZaqNpqvjWwY-E7gIk6lQhqyxpiDA81oODiQ9fTAUTUgO2DJ6ZZhf2ACGYkArctWS/s600/merge_mp3_04.png" onclick="return hs.expand(this)"><img border="0" hspace="10" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhomDEqGsOwKH7ZqFwzQkN5SDSn8-PhjxuT3O8LUNIa-dYPy-CtUuKl0YUS30RbetXfypdZ64seLsUaZaqNpqvjWwY-E7gIk6lQhqyxpiDA81oODiQ9fTAUTUgO2DJ6ZZhf2ACGYkArctWS/s200/merge_mp3_04.png" style="float: left;" title="Кликни на картинку и она увеличится" vspace="3" width="200" /></a>
</div>
<div style="clear:left">
<br/>
<br/>
Дизастер! Оказалось, что в Android плохая реализация проигрывания ogg файлов с переменным битрейтом. Плеер не может точно позиционировать на выбранное место. Выглядит это так: вы выставляете проигрывание с позиции 1 час 28 мин 33 сек. Плеер передвигает вперед минут на 20 и начинает воспроизведение. За это я господ их Гугле материл. Бороться с этим можно только установив при кодировании постоянный битрейт.<br/>
<br/>
Для книги вполне достаточно битрейта 96 к.
</div>
<br/>
<br/>
Полезные ссылки:<br/>
1. <a href="http://habrahabr.ru/post/118454/">Кодирование аудио с потерями. Что к чему?</a><br/>
2. <a href="http://code.google.com/p/mutagen/">mutagen</a>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-85044917894069020072013-09-01T20:42:00.001+04:002016-03-24T18:58:19.473+03:00Kobo Glo Reader. Update Firmware.Не так давно я купил замечательную игрушку Kobo Glo Reader.<br/>
Стоит он не дорого, а вещь просто великолепная.<br/>
<br/>
Руки у меня шаловливые и я решил заапдейтить последнюю версию Firmware.<br/>
<br/>
Делаем так.<br/>
<br/>
1. Скачать <a href="http://www.mobileread.com/forums/showthread.php?t=185660">Firmware</a>.<br/>
2. Распаковать в отдельную директорию:<br/>
<pre class="brush: bash; toolbar: true;" >
:~/stuff/kobo/firmware/2.81$ ls -l
total 79940
-rw-r--r-- 1 axa axa 81842613 июля 16 01:32 KoboRoot.tgz
-rw-r--r-- 1 axa axa 468 июля 16 01:32 manifest.md5sum
drwxr-xr-x 3 axa axa 4096 сент. 1 19:12 upgrade
</pre>
3. Копируем это содержимое в каталог .kobo
<pre class="brush: bash; toolbar: true;" >
/media/axa/KOBOeReader/.kobo$ ls -l
total 85440
-rw-r--r-- 1 axa axa 33 авг. 18 08:02 affiliate.conf
drwx------ 2 axa axa 4096 июля 28 06:24 certificates
-rw-r--r-- 1 axa axa 78 окт. 16 2012 device.salt.conf
drwx------ 2 axa axa 4096 апр. 29 19:20 dict
drwx------ 2 axa axa 98304 сент. 26 2012 images
drwx------ 2 axa axa 4096 мая 1 2012 kepub
drwx------ 2 axa axa 4096 окт. 16 2012 Kobo
-rw-r--r-- 1 axa axa 5445632 сент. 1 16:48 KoboReader.sqlite
-rw-r--r-- 1 axa axa 81842613 июля 16 01:32 KoboRoot.tgz
-rw-r--r-- 1 axa axa 468 июля 16 01:32 manifest.md5sum
drwx------ 5 axa axa 4096 февр. 28 2013 slideshow
-rw-r--r-- 1 axa axa 10398 апр. 29 12:36 stack_00.log
-rw-r--r-- 1 axa axa 6263 мая 20 19:31 stack_01.log
-rw-r--r-- 1 axa axa 6267 мая 20 19:32 stack_02.log
-rw-r--r-- 1 axa axa 17290 авг. 17 22:38 stack_03.log
-rw-r--r-- 1 axa axa 4967 сент. 1 00:21 Trolltech.conf
drwx------ 3 axa axa 4096 сент. 1 19:12 upgrade
-rw-r--r-- 1 axa axa 83 сент. 1 00:21 version
</pre>
4. Отключаем ридер от компьютера и ждем когда ридер перезагрузится.
Профит.
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com3tag:blogger.com,1999:blog-3966048831613183164.post-18625013253907364272013-04-01T11:45:00.000+04:002017-08-04T09:00:11.541+03:00Torrent Transmission 2.76 for ReadyNAS Duo<div class="separator" style="clear: both; text-align: left;">
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDMlRj3L3U934JuAENxolyXtlKiRqBYbtL0m-NZ1K8bhunhJxLpFPfwNehyC3QIxnm8Sx2JBAGDc2iNYnjUsHaZHxrbdN29WVE5XkwuGdWJjXiMFU0devlEXVN15sVhD_1W_NDaTu6EfCB/s900/Transmission+Remote+GUI_001.jpg" onclick="return hs.expand(this)"><img border="0" hspace="10" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDMlRj3L3U934JuAENxolyXtlKiRqBYbtL0m-NZ1K8bhunhJxLpFPfwNehyC3QIxnm8Sx2JBAGDc2iNYnjUsHaZHxrbdN29WVE5XkwuGdWJjXiMFU0devlEXVN15sVhD_1W_NDaTu6EfCB/s200/Transmission+Remote+GUI_001.jpg" style="float: left;" title="Кликни на картинку и она увеличится" vspace="3" width="200" /></a></div>
Обновил на <a href="http://support.netgear.com/product/RND2000v1%2b%2428ReadyNAS%2bDuo%2bv1%2429">ReadyNAS Duo</a> демон torrent transmission до версии 2.76.<br />
Стоило это $2.49 или 75 рублей.<br />
Скорость обмена хорошая.<br />
Позыв заменить железку ушел.<br />
<br />
<br />
<br />
<a href="http://readynasxtras.com/readynas-sparc-add-ons/transmission-sparc">http://readynasxtras.com/readynas-sparc-add-ons/transmission-sparc</a><br />
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com0tag:blogger.com,1999:blog-3966048831613183164.post-47241267344353440972012-08-22T22:42:00.000+04:002017-08-04T09:26:43.918+03:00Linux. How to delete duplicate images 2?<div class="separator" style="clear: both; text-align: center;">
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMUT3KB8JllpNJXMRrq3KHJ6wnnTRDoA_xNp9BoRzMbqzX2XAmUDiLlUwRAvpYxGH08hJrDbht1X8IlPwD12N1HFzgdEcMbvDyhVugqJLPYaXZms6YFt5UYAkvVYvLOFwiedemIgYvDaKn/s500/True-Internal-Duplicate-Content1.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMUT3KB8JllpNJXMRrq3KHJ6wnnTRDoA_xNp9BoRzMbqzX2XAmUDiLlUwRAvpYxGH08hJrDbht1X8IlPwD12N1HFzgdEcMbvDyhVugqJLPYaXZms6YFt5UYAkvVYvLOFwiedemIgYvDaKn/s500/True-Internal-Duplicate-Content1.jpg" title="Кликни на картинку и она увеличится" border="0" height="100" hspace="10" vspace="3" style="float: left;" /></a></div>
Для создания и поддержания в актуальном виде коллекции изображений нужно иметь инструмент, позволяющий находить и удалять дубликаты. В свое время я <a target=_new href="http://axa-ru.blogspot.com/2011/10/linux-how-to-compare-images.html">пытался сделать такой инструмент</a>.<br />
<br />
Но подход, который я использовал требует значительной производительности и на больших коллекциях маленькая утилита разрастается достаточно большую программу со свое базой данных с интерфейсом и всеми прелестями программного проекта.<br />
<br />
Более эффективно воспользоваться существующими инструментами, например мощной программой управления фотоколлекцией DigiKam.<br />
<br />
Но штука в том, что DigiKam имеет очень мощный инструмент поиска дубликатов, не имеет возможности работы с дубликатами, кроме как мышкой и клавиатурой.<br />
<br />
Я провел небольшое расследование и обнаружил, что результаты поиска дубликатов сохраняются в базе данных, которая обычно располагается в <i>$HOME/Pictures/digikam4.db</i><br />
<br />
Как DigiKam сохраняет результаты поиска я покажу на следующем примере.<br />
<div style="clear:left">
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyI3fM5TbqKlVReeQlLN6_qgYvrAjExhoOSanu385TmSUr76kU9XxPxs3k-he0l1AryNgRATOY_P7UJaHQAH3RhFdTMjREVdDo2XqKbYRRo-8CpCGzTCT53iiCthWZpMPns-mudFHUHXww/s904/test2.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyI3fM5TbqKlVReeQlLN6_qgYvrAjExhoOSanu385TmSUr76kU9XxPxs3k-he0l1AryNgRATOY_P7UJaHQAH3RhFdTMjREVdDo2XqKbYRRo-8CpCGzTCT53iiCthWZpMPns-mudFHUHXww/s904/test2.jpg" title="Кликни на картинку и она увеличится" border="0" height="120" hspace="10" vspace="3" style="float: left;" /></a><br />
Есть папка с изображениями.<br />
В программе digikam запускаем поиск одинаковых изображений.<br />
</div>
<div style="clear:left">
<br />
Результаты поиска сохраняются в таблице searches. Эта таблица содержит строки с результатами поиска.
</div>
<div style="clear:left">
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ENPDn9ftTuJSP6XErIXgpinAatRl44D60RCUFMkH0AEJkbnRRGEPt4YES744xVTaCYjsUWTH0MNR-o-_bjN3XxAuamsxBEdXX_oYr67E8Gdb5guK4mnmBRuf9itTTHkpaw4vAosFDBGC/s1412/searches.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ENPDn9ftTuJSP6XErIXgpinAatRl44D60RCUFMkH0AEJkbnRRGEPt4YES744xVTaCYjsUWTH0MNR-o-_bjN3XxAuamsxBEdXX_oYr67E8Gdb5guK4mnmBRuf9itTTHkpaw4vAosFDBGC/s1412/searches.jpg" title="Кликни на картинку и она увеличится" border="0" height="120" hspace="10" vspace="3" style="float: left;" /></a><br />
</div>
<div style="clear:left">
<br />
Каждая строка в поле query хранит xml список содержащий id одинаковых изображений. На приведенном листинге я отформатировал xml, чтобы удобней его было читать.
<pre class="brush: xml; toolbar: true;" >
<?xml version="1.0"?>
<search>
<group>
<field name="imageid" relation="oneof">
<listitem>3</listitem>
<listitem>2</listitem>
<listitem>1</listitem>
</field>
</group>
</search>
</pre>
<br />
Имена файлов изображений хранятся в таблице images и доступны по id
</div>
<div style="clear:left">
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_WR3-kf009iBHrCXIJApbsjudNeLQBvPSBPJEcIlikz4lez-3kZq_X4bVTYrUU-rK1yCKcX-0HlAAxfZD15KLDzf_UtIw-pdq9P93Kfh38nEEuRnOueVogYmZxk0WddNeyIMNasXxXamc/s1050/images.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_WR3-kf009iBHrCXIJApbsjudNeLQBvPSBPJEcIlikz4lez-3kZq_X4bVTYrUU-rK1yCKcX-0HlAAxfZD15KLDzf_UtIw-pdq9P93Kfh38nEEuRnOueVogYmZxk0WddNeyIMNasXxXamc/s1050/images.jpg" title="Кликни на картинку и она увеличится" border="0" height="120" hspace="10" vspace="3" style="float: left;" /></a><br />
</div>
<div style="clear:left">
<br />
Путь <relativePath> доступен по полю <id> (номер альбома) в таблице albums:
</div>
<div style="clear:left">
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgirAxzQXQLP2kQ-m7eHdrKm3UiZaKkroxR9P7lzgWQJdkGU5kJOSFF3fDIkPAGG6SiVDs-Wc7I0k326Vr50ETiVO29rzNUROb8F83LQWrp7KvCSmkyCF0QQu7El9DqqxzGpIqLDtow6UQ6/s978/albums.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgirAxzQXQLP2kQ-m7eHdrKm3UiZaKkroxR9P7lzgWQJdkGU5kJOSFF3fDIkPAGG6SiVDs-Wc7I0k326Vr50ETiVO29rzNUROb8F83LQWrp7KvCSmkyCF0QQu7El9DqqxzGpIqLDtow6UQ6/s978/albums.jpg" title="Кликни на картинку и она увеличится" border="0" height="120" hspace="10" vspace="3" style="float: left;" /></a><br />
</div>
<div style="clear:left">
<br />
Путь к альбомам хранится в таблице albumroot:
</div>
<div style="clear:left">
<a data-fancybox="gallery" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXxEGpaAkpmWn1n9pfNfnfTVw20YNIj6lOl5siUfMKd6bARMi_1Fi3J0YEJObVWxpfn8LPkErV_DYnCIUqd2lcuMzHYF8F1xrFc5CDA5x1chvTk34o5ZtujwrYR7Pp8IepIuC-vCPA2Ax/s941/albumroot.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXxEGpaAkpmWn1n9pfNfnfTVw20YNIj6lOl5siUfMKd6bARMi_1Fi3J0YEJObVWxpfn8LPkErV_DYnCIUqd2lcuMzHYF8F1xrFc5CDA5x1chvTk34o5ZtujwrYR7Pp8IepIuC-vCPA2Ax/s941/albumroot.jpg" title="Кликни на картинку и она увеличится" border="0" height="120" hspace="10" vspace="3" style="float: left;" /></a><br />
</div>
<div style="clear:left">
<br />
Ниже пример реализации функции на bash получения пути изображения с id = 5
<pre class="brush: bash; toolbar: true;" >
#!/bin/bash
DBPATH=digikam4.db
getPicture ()
{
FILENAME=$(sqlite3 $DBPATH "SELECT name FROM images WHERE id=$1")
IDALBUM=$(sqlite3 $DBPATH "SELECT album FROM images WHERE id=$1")
REALTIVEPATH=$(sqlite3 $DBPATH "SELECT relativePath FROM albums WHERE id=$IDALBUM")
IDALBUMROOT=$(sqlite3 $DBPATH "SELECT albumRoot FROM albums WHERE id=$IDALBUM")
ROOTPATH=$(sqlite3 $DBPATH "SELECT specificPath FROM albumroots WHERE id=$IDALBUMROOT")
echo /home/${ROOTPATH}/${REALTIVEPATH}/${FILENAME}
}
FNAME=$(getPicture 5)
echo $FNAME
</pre>
</div>
<div style="clear:left">
<br />
Ну, собственно, вот и венец творений. <br />
Программа на bash, которая удаляет дубликаты изображений.<br />
Программа удаляет дубликат меньшего размера.<br />
Я ее успешно использую совместно с DigiKam 2.8 под Ubuntu.<br/>
Перед запуском скрипта нужно выйти из DigiKam, иначе скрипт не может получить доступ к базе, которая лочится.
<pre class="brush: bash; toolbar: true;" >
#!/bin/bash
#-------------------------------------------------------------------
# Удаляет дубликаты картинок на основании поиска дубликатов в
# программе DigiKam
#
# Проверено с DigiKam v2.8
COPYRUGHT="\n© http://axa-ru.blogspot.com. Licensed under GPLv3."
#-------------------------------------------------------------------
#VERSION=0.1 # initial version
#VERSION=0.11 # Some DeBugs
#VERSION=0.12 # Добавлено приоритет удаления
#VERSION=0.13 # Some changes
VERSION=0.14 # Испрвавление ошибки в delSmallPic()
DEBUG=0
VERBOSE=1
DBPATH=$HOME/Pictures/digikam4.db # Путь до базы даннх DigiKam
EXITERROR=192
SAVEPIC=""
PATTERN=0_WallPapers99
# Color ANSY sequence
BLACK="\033[0;30m"
RED="\033[0;31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
BLUE="\033[0;34m"
MAGENTA="\033[0;35m"
CYAN="\033[0;36m"
WHITE="\033[0;37m"
GRAY1="\033[38;5;252m"
GRAY2="\033[38;5;245m"
GRAY3="\033[38;5;238m"
NOCOLOR="\033[0;38m"
#-------------------------------------------------------------------
# Возвращает по id изображения его полный путь
# пример использования:
# FNAME=$(getPicture 1653)
# возвращает путь к картинке №1653
getPicture ()
{
FILENAME=$(sqlite3 $DBPATH "SELECT name FROM images WHERE id=$1")
IDALBUM=$(sqlite3 $DBPATH "SELECT album FROM images WHERE id=$1")
REALTIVEPATH=$(sqlite3 $DBPATH "SELECT relativePath FROM albums WHERE id=$IDALBUM")
IDALBUMROOT=$(sqlite3 $DBPATH "SELECT albumRoot FROM albums WHERE id=$IDALBUM")
local ALBUM_TYPE=$(sqlite3 $DBPATH "SELECT type FROM albumroots WHERE id=$IDALBUMROOT")
case $ALBUM_TYPE in
1) ROOTPATH=/home$(sqlite3 $DBPATH "SELECT specificPath FROM albumroots WHERE id=$IDALBUMROOT");;
2) echo "External media not supported yet. Exiting"; exit $EXITERROR;;
3) ROOTPATH=$(sqlite3 $DBPATH "SELECT identifier FROM albumroots WHERE id=$IDALBUMROOT" | sed 's/networkshareid:?mountpath=//g' | sed 's/%2F/\//g');;
esac
echo ${ROOTPATH}/${REALTIVEPATH}/${FILENAME}
}
#-------------------------------------------------------------------
# Удаляет меньшую картинку из двух
#
delSmallPic()
{
((DEBUG)) && echo " ***** $FUNCNAME"
if [ "$SAVEPIC" == "" ]; then
#((DEBUG)) && echo " $LINENO: Init SAVEPIC"
SAVEPIC="$1";
else
local W0=$(identify -format '%w' "$SAVEPIC" 2> /dev/null)
local H0=$(identify -format '%h' "$SAVEPIC" 2> /dev/null)
local W1=$(identify -format '%w' "$1" 2> /dev/null)
local H1=$(identify -format '%h' "$1" 2> /dev/null)
((DEBUG)) && echo " $LINENO: PIC1=$SAVEPIC"
((DEBUG)) && echo " $LINENO: PIC2=$1"
((DEBUG)) && echo " $LINENO: $W0 -eq $W1 -a $H0 -eq $H1"
# Если картинки одинаковы то удаляет ту, в пути (имени)
# которой есть $PATTERN
if [ $W0 -eq $W1 -a $H0 -eq $H1 ]; then
((DEBUG)) && echo " $LINENO: PIC1 == PIC2"
if [[ "$SAVEPIC" =~ .*$PATTERN.* ]]; then
echo "Delete $SAVEPIC"
((DEBUG)) && printf " %s: " $LINENO
! ((DEBUG)) && rm "$SAVEPIC"
SAVEPIC="$1"
else
((DEBUG)) && printf " %s: " $LINENO
echo "Delete $1"
! ((DEBUG)) && rm "$1"
fi
else
if [ $W0 -le $W1 -o $H0 -le $H1 ]; then
((DEBUG)) && echo " $LINENO: PIC1 <= PIC2"
echo "Delete $SAVEPIC"
((DEBUG)) && printf " %s: " $LINENO
! ((DEBUG)) && rm "$SAVEPIC"
SAVEPIC="$1"
else
((DEBUG)) && echo " $LINENO: PIC1 > PIC2"
((DEBUG)) && printf " %s: " $LINENO
echo "Delete $1"
! ((DEBUG)) && rm "$1"
fi
fi
fi
}
#-------------------------------------------------------------------
# Удаляет дубликаты картинок из списка
# В качестве параметра получает список id картинок с разделителями пробелами
delDupPic ()
{
while (( "$#" )); do
local PAR=$1
PICURL=$(getPicture "$PAR")
if [ ! -f $PICURL ]; then
echo -e "${RED}File $PICURL das not exists.${NOCOLOR}"
# echo -e "${RED}Use digiKam!!!${NOCOLOR}"
# exit $EXITERROR
fi
((DEBUG)) && echo " $LINENO: PAR=$PAR, PICURL=$PICURL"
delSmallPic $PICURL
shift
done
}
#-------------------------------------------------------------------
# main code
#
while getopts "Dd:hVv" SWITCH ; do
case $SWITCH in
D) DEBUG=1;;
d) if [[ $OPTARG == "" ]]; then
printf "$SCRIPT:$LINENO: must be argument\n";
exit $ERROR;
else
PATTERN=$OPTARG;
fi;;
h) echo -e "usage:
${CYAN}$0 [-OPTION]${NOCOLOR}
OPTION is
${CYAN}D${NOCOLOR} - Debug On
${CYAN}d [PAT]${NOCOLOR} - Delete first pic by PATtern
Example:
deldup.sh -d 00_Picture
will delete any picture
/mnt/nas3d0/Pictures/Wallpaper/00_Pictures/Pictures_0123.jpg
${CYAN}h${NOCOLOR} - This help
${CYAN}v${NOCOLOR} - Verbose output, No output by default"
exit 0
;;
V) echo -e "${CYAN}$0 Version $VERSION\n${COPYRUGHT}${NOCOLOR}"; exit 0;;
v) VERBOSE=1;;
*) printf "$SCRIPT:$LINENO: script error: unhandled argument\n"; exit $ERROR;;
esac
done
((DEBUG)) && echo "$LINENO: TOTAL=$TOTAL"
# Type=7 - записи после операции поиска дубликатов
X=$(sqlite3 $DBPATH "SELECT id FROM searches where type=7 LIMIT 1")
TOTAL=$(sqlite3 $DBPATH "SELECT COUNT (*) FROM searches WHERE type=7")
echo "$TOTAL Duplicate Images Will be Delete "
((LAST=TOTAL+X))
((DEBUG)) && echo "$LINENO: X=$X, LAST=$LAST, TOTAL=$TOTAL"
while [ $X -lt $LAST ]
do
SAVEPIC=""
# Получаем список записей с дублированными картинками
# Ниже показан отформатированный пример.
# <?xml version="1.0"?>
# <search>
# <group>
# <field name="imageid" relation="oneof">
# <listitem>5033</listitem>
# <listitem>201</listitem>
# <listitem>84132</listitem>
# </field>
# </group>
# </search>
LISTEQPIC=$(sqlite3 $DBPATH "SELECT query FROM searches WHERE id=$X" | sed 's/<\/listitem>/,/g' | sed 's/<listitem>//g' | sed 's/.*oneof\">//' | sed 's/,<\/.*//' | sed 's/,/ /g' )
((DEBUG)) && echo "$LINENO: X=$X, LISTEQPIC=$LISTEQPIC"
delDupPic $LISTEQPIC
((X++))
done
</pre>
</div>
<br />
По хорошему этот скрипт можно оформить в виде плагина в DigiKam и запускать оттуда. Будет функциональней и удобней. Но мне лень ковырять сам DigiKam. Если кто сделает такое добро, то отпишите.
<br />
<br />
<br />
<img style="float:left; margin:0 2px 2px 0;width: 15px; height: 15px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1vWbwZ84iH5fS9nfWMqtNqk4_FAVsiG4wb2yJPOt2K0G5ahg1yFxVC1uxaffJxJyaPSjxNhw1imlDz5jXYzED_UcTwNyZat0x1GgRYjGWMmkugBGcyY4SGygtp7ULEAv_Uescf7Bfaoaw/s320/notification-network-wireless.png"><b>Полезные ссылки:</b><br />
<ul>
<li><a target="_new" href="http://www.digikam.org/">DigiKam is an advanced digital photo management application for Linux, Windows, and Mac-OSX.</a>
</li>
<li><a target="_new" href="http://websvn.kde.org/*checkout*/trunk/extragear/graphics/digikam/project/DBSCHEMA.ODS?revision=991317&pathrev=991317">DigiKam database schema.</a>
</li>
<li><a target="_new" href="http://docs.kde.org/development/en/extragear-graphics/kipi-plugins/index.html">The Kipi Plugins Handbook.</a>
</li>
<li><a target="_new" href="http://extragear.kde.org/apps/kipi/#documentation">Kipi (KDE Image Plugin Interface).</a>
</li>
</ul>
Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com4tag:blogger.com,1999:blog-3966048831613183164.post-21427967152651678362012-08-12T23:55:00.002+04:002012-08-13T07:50:51.265+04:00Corbina (beeline) radio.<div class="separator" style="clear: both; text-align: center;"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK4kIp5YYuchK7Vj66EKQ5sgdYKocOduadHBlqwNh5j2GWziIEBi19DnCjjEgoPvHymhaXy0FkPzGWp5dhGsgXoZudx8PavCwVQQTyG1nxvYPpbkuYpzER7c1Xhh5W2Ae_FZku8JjBbmZQ/s256/Radio.png" hspace="15" vspace="5" style="float: left; height: 64px;" /></div>
В последнее время эффективные менеджеры beeline монетизируют все, что можно и все, что нельзя.<br />
А что не получается монетизировать, то им не интересно.<br />
Похоже, что эффективным менеджерам из билайн до лампочки интернет радио, доставшееся от Корбины.<br />
Какое то радио работает, но <a target="_new" href="http://my.corbina.ru/entertainment/radio/anons_radio.php">полного списка станций я не нашел</a>.<br />
<br />
Для поиска работающих радиостанций я написал простенький скрипт на bash: <br />
<pre class="brush: shell; toolbar: true;" >
#!/bin/bash
PORT=8000
while [ $PORT -lt 10000 ]; do
printf "\r%s " "$PORT"
RESULT=$(mplayer -frames 0 http://radio.corbina.ru:$PORT/ 2>/dev/null | grep playback)
if [ "$RESULT" == "Starting playback..." ]
then
NAME=$(mplayer -frames 0 http://radio.corbina.ru:$PORT/ 2>/dev/null | grep Name)
echo -e "\rhttp://radio.corbina.ru:$PORT $NAME"
fi
((PORT++))
done
</pre>
Запустив его в консоли через пару минут мы получаем все работающие станции в диапазоне портов от 8000 до 10000:<br />
<terminal>
http://radio.corbina.ru:8000 Name : (GTM) CorBinA PsychedeliC StaTioN
http://radio.corbina.ru:8005 Name : POP CorBinA RaDiO StatioN
http://radio.corbina.ru:8010 Name : Corbina Dark & Metal Radio
http://radio.corbina.ru:8015 Name : DruM and BasS CorBinA RaDiO StatioN
http://radio.corbina.ru:8025 Name : (GTM) HousE CorBinA RaDiO StatioN
http://radio.corbina.ru:8030 Name : BriT CorBinA RaDiO StatioN
http://radio.corbina.ru:8035 Name : (GTM) AmbienT CorBinA RaDiO StatioN
http://radio.corbina.ru:8040 Name : Deep Mix Moscow Radio: deepmix.ru
http://radio.corbina.ru:8050 Name : EuroHIT CorBinA RaDiO StatioN
http://radio.corbina.ru:8067 Name : ShaNsoN CorBinA RaDiO StatioN
http://radio.corbina.ru:8071 Name : RagnaroK CorBinA RaDiO StatioN
http://radio.corbina.ru:8073 Name : RocK-Ru CorBinA RaDiO StatioN
http://radio.corbina.ru:8107 Name : Heavy Music Atmospheric Radio
http://radio.corbina.ru:9040 Name : Deep Mix Moscow Radio: deepmix.ru
http://radio.corbina.ru:9045 Name : Deep Mix Moscow Radio: deepmix.ru
http://radio.corbina.ru:9054 Name : Corbina Radio: Big Beat radio (HighQuality)
http://radio.corbina.ru:9056 Name : Corbina Radio: BigBeat Radio
</terminal>Axahttp://www.blogger.com/profile/03905132228379394219noreply@blogger.com1