Поиск по этому блогу

четверг, 16 августа 2018 г.

Прослушивание аудиокниг в "турбо-режиме"

Для меня аудиокниги всегда имели два очень серьёзных недостатка (по сравнению с "обычными": электронными или бумажными):
1. Стоит хоть немного отвлечься и вот уже утратил нить повествования, нужно перематывать обратно и слушать ещё раз. Особенно часто отвлекаешься, если книга начитана медленным, заунывным голосом.
2. На прослушивание аудиокниги уходит куда больше времени, чем на чтение этой же "обычной" книги. За то время, пока слушаешь "одну страницу", можно успеть прочитать штук пять.
Тем не менее, неоспоримым преимуществом аудиокниг для меня всегда было то, что их можно слушать даже в таких условиях, когда "обычную" книгу не почитаешь: во время ходьбы, в темноте и т.п.
И вот однажды, слушая один подкаст (уже сейчас не вспомню какой), я узнал о существовании метода, который может в значительной степени устранить оба "недостатка" аудиокниг: всего лишь нужно слушать аудиокниги на ускоренном воспроизведении. Начать можно с 1,3x, потом довести до 1,5х.
Довольно быстро выяснилось, что штатный плеер на моём Android-телефоне не умеет воспроизводить аудиофайлы в ускоренном режиме. Поэтому полез на F-Droid. Там нашлась программа Voice (Simple audiobook player), которая вполне меня устроила (она же есть и в Google Play под названием Voice Audiobook Player):

После выбора аудиокниги надо нажать на значок и выбрать желаемую скорость воспроизведения.

Дополнение от 06.12.2019: Аналогичным образом в "турбо-режиме" можно смотреть видео на YouTube. Для этого нужно открыть меню "Настройки", и в разделе "Скорость" выбрать желаемую скорость воспроизведения:


Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

вторник, 3 октября 2017 г.

Вычисление хэш суммы MD5 в 1С 8.3

Следующая функция вернёт хэш MD5 для указанного файла.

Код:
Функция ВычислитьMD5Файла(ИмяФайла) Экспорт ХэшированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); ХэшированиеДанных.ДобавитьФайл(ИмяФайла); Хэш = НРег(СтрЗаменить(ХэшированиеДанных.ХешСумма, " ", "")); Возврат Хэш; КонецФункции

Следующая функция вернёт хэш MD5 для двоичных данных или строки в кодировке UTF8.

Код:
// Данные - ДвоичныеДанные или Строка в кодировке UTF8 Функция ВычислитьMD5(Данные) Экспорт ХэшированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); ХэшированиеДанных.Добавить(Данные); Хэш = НРег(СтрЗаменить(ХэшированиеДанных.ХешСумма, " ", "")); Возврат Хэш; КонецФункции
Дополнение от 13.01.2022: вместо СтрЗаменить(ХэшированиеДанных.ХешСумма, " ", "") можно (и нужно?) использовать ПолучитьHexСтрокуИзБуфераДвоичныхДанных(ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ХэшированиеДанных.ХешСумма))

Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

суббота, 22 апреля 2017 г.

Добавление штампов (stamps) в Tux Paint

При установке Tux Paint из штатных репозиториев некоторых дистрибутивов Linux (в частности, Fedora 25) или на Android (через F-Droid) не устанавливаются штампы (stamps).

А как без них жить? :)


Чтобы установить штампы нужно:
В Linux (Fedora 25):
  • Распаковать содержимое папки /TuxPaint/data/stamps/ из архива в папку /usr/share/tuxpaint/stamps/ чтобы получилось так:
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_be.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_bg.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_ca.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_da.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_es.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_fr.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_ro.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1_desc_ru.ogg
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1.png
/usr/share/tuxpaint/stamps/animals/amphibians/frog-1.txt
...
В Android:
  • Распаковать содержимое папки /TuxPaint/data/stamps/ из архива в папку /mnt/sdcard/TuxPaint/ (на Samsung Galaxy Tab это папка /storage/emulated/0/TuxPaint/).
Теперь запускаем Tux Paint и наслаждаемся!

P.S. Чтобы уменьшить объем, который занимают файлы штампов, можно удалить "лишние" файлы с озвучкой на неиспользуемых языках - все файлы *_desc_*.ogg, кроме *_desc_ru.ogg.

    четверг, 25 февраля 2016 г.

    Как убрать лишние пробелы при выводе строковых полей в отчёте на СКД

    Понадобилось мне при выводе отчёта на системе компоновки данных (СКД) обрезать пробелы в строковых значениях (а именно, концевые пробелы у номеров документов).
    Решения, найденные с помощью гугления и яндексирования, в основном сводились либо к обрезанию пробелов в запросе (что для моей задачи было всё-таки чрезмерным усложнением), либо к использованию глобальных функций общих модулей (что требовало внесения изменения в конфигурацию, и тоже по сути являлось решением из разряда "из пушки по воробьям").
    В итоге остановился на самом простом варианте, который только пришёл в голову: обрезать пробелы в процедуре ПриКомпоновкеРезультата() при выводе данных в табличный документ.

    Код:
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Настройки = КомпоновщикНастроек.ПолучитьНастройки(); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.НачатьВывод(); Пока Истина Цикл ЭлементРезультата = ПроцессорКомпоновки.Следующий(); Если ЭлементРезультата = Неопределено Тогда Прервать; КонецЕсли; Для Каждого ЗначПарам Из ЭлементРезультата.ЗначенияПараметров Цикл Если ТипЗнч(ЗначПарам.Значение) = Тип("Строка") И ЗначПарам.Значение <> СокрЛП(ЗначПарам.Значение) Тогда ЗначПарам.Значение = СокрЛП(ЗначПарам.Значение); // <--- обрезаем пробелы тут КонецЕсли; КонецЦикла; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); КонецЦикла; ДокументРезультат = ПроцессорВывода.ЗакончитьВывод(); КонецПроцедуры


    Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

    вторник, 23 февраля 2016 г.

    Изменение порядка учётных записей в Thunderbird

    Изменить порядок учётных записей в Thunderbird можно и без использования дополнений.

    Вариант 1. Заходим в меню Правка / Настройки, закладка Основные, кнопка "Редактор настроек...". Обещаем, что будем осторожны, открывается редактор настроек. Ищем настройку mail.accountmanager.accounts. Её значение имеет вид account1,account2,account3. Это и есть порядок учётных записей. Например, если нужно чтобы последняя учётная запись стала первой, то необходимо изменить значение этой настройки на account3,account1,account2.

    Вариант 2. Выходим из Thunderbird, переходим в директорию с профайлом, находим там файл prefs.js, открываем его любым текстовым редактором, находим в этом файле строку вида:
    user_pref("mail.accountmanager.accounts", "account1,account2,account3");
    и меняем порядок следования account-ов на требуемый. Например, если нужно чтобы последняя учётная запись стала первой, то необходимо изменить эту строку на:
    user_pref("mail.accountmanager.accounts", "account3,account1,account2");
    Сайт Thunderbird: https://www.mozilla.org/en-US/thunderbird/

    Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

    вторник, 22 декабря 2015 г.

    Как убедиться в том, что измененная типовая конфигурация 1С обновлена успешно?

    Как убедиться, что измененную типовую конфигурацию мы обновили успешно и ничего не отвалилилось?
    Итак, после обновления у нас есть 4 cf-ника:
    1. ПоставщикСтарая - старая конфигурация поставщика; 
    2. ПоставщикНовая - новая конфигурация поставщика - та, на которую обновляли; 
    3. ОсновнаяСтарая - измененная конфигурация, по сути это ПоставщикСтарая с нашими изменениями; 
    4. ОсновнаяНовая - то, что получилось после обновления ОсновнаяСтарая с помощью ПоставщикНовая. 
    Теперь в двух конфигураторах сравниваем попарно:
    1. ПоставщикСтарая и ПоставщикНовая
    2. ОсновнаяСтарая и ОсновнаяНовая
    Для каждого сравнения конфигураций формируем полный "Отчет о сравнении объектов..." (для всех объектов конфигурации) в формате "Подробно", с подчиненными объектами метаданных:
     

    и сохраняем эти отчеты в текстовые файлы. Эти два текстовых файла сравниваем с помощью любой сравнивалки текста (я использую WinMerge).
    Так вот - не считая технической информации, такой как номера строк с изменным/удаленным кодом и т.п., эти файлы НЕ ДОЛЖНЫ ОТЛИЧАТЬСЯ! Потому что оба отчёта показывают одно и то же - разницу, которую добавила в конфигурацию 1С.

    После этого сравниваем попарно:
    1. ПоставщикСтарая и ОсновнаяСтарая
    2. ПоставщикНовая и ОсновнаяНовая
    Аналогично сохраняем отчеты о сравнении в текстовые файлы и сравниваем эти текстовые файлы. Они тоже НЕ ДОЛЖНЫ ОТЛИЧАТЬСЯ! Потому что оба отчёта показывают одно и то же - разницу, которую добавили в конфигурацию мы.

    Если что-то отличается (помимо технической информации) - значит или не накатили какое-то изменение из типовой, или затерли какое-то своё изменение.

    P.S. Чтобы убрать из отчетов о сравнении неинформативный хлам (такой как номера строк с изменным/удаленным кодом и т.п.), можно выполнить в текстовых файлах с отчетами следующие замены по регекспам:
    1. Заменить:
    ^(\s*)Объект присутствует только в(.+) конфигурации: \d+ - \d+$
    на:
    $1Объект присутствует только в$2 конфигурации: N - N

    2. Заменить:
    ^(\s*)Изменено: \d+ - \d+$
    на:
    $1Изменено: N - N

    P.P.S. Эти замены можно выполнить с помощью следующего макроса для Notepad++ (добавить в %appdata%\Notepad++\shortcuts.xml в раздел <Macros>...</Macros>)
    <Macro name="&#x041E;&#x0431;&#x0440;&#x0430;&#x0431;&#x043E;&#x0442;&#x043A;&#x0430;&#x041E;&#x0442;&#x0447;&#x0435;&#x0442;&#x0430;&#x041E;&#x0421;&#x0440;&#x0430;&#x0432;&#x043D;&#x0435;&#x043D;&#x0438;&#x0438;" Ctrl="no" Alt="no" Shift="no" Key="0">
      <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
      <Action type="3" message="1601" wParam="0" lParam="0" sParam="^(\s*)&#x041E;&#x0431;&#x044A;&#x0435;&#x043A;&#x0442; &#x043F;&#x0440;&#x0438;&#x0441;&#x0443;&#x0442;&#x0441;&#x0442;&#x0432;&#x0443;&#x0435;&#x0442; &#x0442;&#x043E;&#x043B;&#x044C;&#x043A;&#x043E; &#x0432;(.+) &#x043A;&#x043E;&#x043D;&#x0444;&#x0438;&#x0433;&#x0443;&#x0440;&#x0430;&#x0446;&#x0438;&#x0438;: \d+ - \d+$" />
      <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
      <Action type="3" message="1602" wParam="0" lParam="0" sParam="$1&#x041E;&#x0431;&#x044A;&#x0435;&#x043A;&#x0442; &#x043F;&#x0440;&#x0438;&#x0441;&#x0443;&#x0442;&#x0441;&#x0442;&#x0432;&#x0443;&#x0435;&#x0442; &#x0442;&#x043E;&#x043B;&#x044C;&#x043A;&#x043E; &#x0432;$2 &#x043A;&#x043E;&#x043D;&#x0444;&#x0438;&#x0433;&#x0443;&#x0440;&#x0430;&#x0446;&#x0438;&#x0438;: N - N" />
      <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
      <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
      <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
      <Action type="3" message="1601" wParam="0" lParam="0" sParam="^(\s*)&#x0418;&#x0437;&#x043C;&#x0435;&#x043D;&#x0435;&#x043D;&#x043E;: \d+ - \d+$" />
      <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
      <Action type="3" message="1602" wParam="0" lParam="0" sParam="$1&#x0418;&#x0437;&#x043C;&#x0435;&#x043D;&#x0435;&#x043D;&#x043E;: N - N" />
      <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
      <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
    </Macro>
    

    четверг, 29 октября 2015 г.

    Вывод статуса задач BOINC в терминале Linux

    Чтобы контролировать ход вычислений в BOINC можно выполнить следующую команду в терминале:
    watch -n 5 "boinccmd --get_tasks | grep -e '\(fraction done:\)\|\(project URL:\)\|\(active_task_state\)\|\(estimated CPU\)\|\(current CPU time\)\|\(---\)'"
    При этом на экран будет выведена (и будет обновляться каждые 5 секунд) информация, подобная этой:
    1) -----------
       project URL: http://sat.isa.ru/pdsat/
       final CPU time: 0.000000
       active_task_state: EXECUTING
       checkpoint CPU time: 29928.380000
       current CPU time: 30554.660000
       fraction done: 0.833333
       estimated CPU time remaining: 3773.624642
    2) -----------
       project URL: http://sat.isa.ru/pdsat/
       final CPU time: 0.000000
       active_task_state: EXECUTING
       checkpoint CPU time: 14886.500000
       current CPU time: 15626.640000
       fraction done: 0.433333
       estimated CPU time remaining: 12963.986928
    3) -----------
       project URL: http://www.worldcommunitygrid.org/
       final CPU time: 0.000000
       active_task_state: UNINITIALIZED
       checkpoint CPU time: 0.000000
       current CPU time: 0.000000
       fraction done: 0.000000
       estimated CPU time remaining: 81226.112086
    Если BOINC запускается на отдельном сервере (или в отдельной виртуалке), то для автоматического запуска предыдущей команды можно добавить в .bashrc следующий код:
    if [ $(tty) == "/dev/tty1" ]; then
      watch -n 5 "boinccmd --get_tasks | grep -e '\(fraction done:\)\|\(project URL:\)\|\(active_task_state\)\|\(estimated CPU\)\|\(current CPU time\)\|\(---\)'"
    fi
    Сайт проекта BOINC: https://boinc.berkeley.edu/

    Данный текст доступен по лицензии Creative Commons Attribution (CC BY)