→ Подкаст ZeroIQ

За годы прослушивания подкастов мне успели надоесть практически все, хотелось чего-то нового, и наконец, ребята из apple-russian, это новое сделали.

Сегодня Олег Сердюков сделал большой анонс подкаста ZeroIQ, который я неистово рекомендую. Звук пока не очень, но главное это контент — это правда интересно слушать.

Живые трансляции тоже скоро обещают, а пока можно послушать и старые выпуски, в общем подписывайтесь.


Пара слов в преддверии Apple Event

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

Я сначала даже накатал в черновике длинную, разгромную простыню в стиле Муртазина, объясняющую почему я не буду смотреть конференцию. Но это нытьё читается так жалко, что весь текст был удалён с лёгкой совестью.

21 марта для меня ничего не произойдёт, это будет обычный день, перед днём, когда я накачу обновления OS X 10.11.4 и iOS 9.3.

Новые гаджеты? Нет, не знаю.


Автоматическое наполнение библиотеки iTunes

Я давно веду медиатеку в iTunes, с того момента, как впервые запустил OS X. Конечно, за это время сделал несколько попыток использовать другие проигрыватели, но в итоге я всё время прихожу к начальной точке. iTunes — это центральный хаб для купленной, рипнутой и скачанной музыки.

Наполнение iTunes Music, как и качество подбора, меня не устраивает, поэтому приходится скачивать FLAC. А так как на what.cd есть всё, то беру оттуда музыку всё чаще.

Ниже воркфлоу, который позволяет в автоматическом режиме импортировать FLAC в iTunes. Automator отслеживает новые поступления и запускает bash-скрипт, который конвертирует FLAC в ALAC, скачивает и внедряет обложку, импортирует треки в медиатеку.

Установка

Нам понадобятся:

  • ffmpeg для конвертации и извлечения метаданных (артист, альбом)
  • atomicparsley для вставки обложек
  • sacad для скачивания обложек
  • python3 как зависимость sacad
  • gnu-sed для правильной выборки названий альбома из метаданных

Зависимости из brew и pip

brew install ffmpeg atomicparsley python3  
brew install gnu-sed --with-default-names  
pip3 install sacad

Настройка Automator

1) Скачиваем, распаковываем и устанавливаем воркфлоу "FLAC to iTunes importer.workflow".
2) В Automator.app добавляем отслеживаемую директорию для FLAC.

В Automator.app добавляем отслеживаемую директорию для FLAC

Теперь новые альбомы, которые попадут в выбранный каталог, будут сконвертированы и отправлены в iTunes "~/Music/iTunes/iTunes Media/Automatically Add to iTunes".

Исходники на GitHub

Обновление 11/02/2016
Убрал "лишнее звено" Hazel. Вся логика перенесена в воркфлоу Automator.

Про автоматизацию работы с сидбокс в OS X

Я активно пользуюсь торрентами, мои интересы это кино и музыка в хорошем качестве. На закрытых трекерах нужные релизы появляются очень быстро, однако за это нужно платить ресурсами своего железа, раздавая скачанное как минимум до рейтинга 1:1.

И тут выхода два: либо держать Transmission постоянно включённым, портить свои жёсткие диски и тратить электричество, либо перенести эту задачу на другую машину, т. н. seedbox. Как вы наверное поняли, я перенёс раздачу файлов на seedbox.

Рейтинги это не единственная проблема. Жёсткое законодательство во многих странах не даёт спокойно жить торрентоводам, присылая огромные штрафы и судебные иски.

В случае использования seedbox эта проблема решается. Вы скачиваете и раздаёте контент далеко, например во Франции, а забираете по зашифрованному каналу, через FTP.

Что получилось?

Я добился полной автоматизации. Т. е. в браузуре кликаю по ссылке скачать .torrent, и через некоторое время на моём жёстком диске появляется контент, с оповещением в Notification Center.

Выгрузка торрентов в rtorrent, старт загрузки и раздачи, скачивание файлов на компьютер, всё это спрятано за несколькими скриптами и не требует никаких движений.

Только изредка приходится заходить в веб морду ruTorrent и удалять раздачи, которые мне не нужны, впрочем это тоже можно автоматизировать.

Веб интерфейс ruTorrent

Выбор seedbox провайдера

Что бы вы не думали, хостинг для "торрентокачалок" давно не роскошь, за 5 или 10 $ в месяц можно получить от 100 Гб до 700 Гб на жёстком диске, а если посчитать сколько вы тратите на электричество и железо, то жаба перестанет вас давить совсем.

При выборе следует обратить внимание на линк дата центра, с вашим интернет провайдером, чтобы быстро забирать контент. Большинство хостеров выкладывают тестовые 100 и 1000 МБ бинарники, по которым можно определиться.

Если вам предоставят гигабитный порт, то средний Blu-ray ремюкс вы будете скачивать за 8 минут, на пределе возможности жёстких дисков, примерно 60 МБ/c.

Я попробовал датацентры в Голландии (Wicked servers, они же tal0ne) и Великобритании (feralhosting).

Нидерланды мой фаворит, они дают примерно 8 МБ/с через HTTP или FTP в один поток, и порядка 20 МБ/с, если забирать многопоточно.

Wicked Servers (tal0ne)

Наиболее интересные тарифы в Голландии без ограничений по трафику:

RevivalBOX — 100 Гб + 1 гбит линк за 4,42 € в месяц.
SweetBOX — 740 Гб + 1 гбит загрузка + 100 мбит отдача за 9,70 € в месяц.

Feral Hosting

Хостинг в Великобритании:

Helium — 1 TB + 10 Гбит линк за 10 £ в месяц. Замечу, что диски HDD, всё равно не дадут и гигабита, какой бы линк не заявляли. Плюсы относительно Wicked Servers это включённые в слот SSH и OpenVPN.

Тут же предоставляются и машины с большими жёсткими дисками, до 6 ТБ, но ценники у них соответствующие. Эти решения не для домашнего использования.

Настройка

rTorrent и автоматическое подхватывание .torrent файлов

На сервере для скачивания торрентов я выбрал rTorrent, он хорошо конфигурируется, а к веб морде ruTorrent написано множество плагинов.

Одна из необходимых мне возможностей, это отслеживание .torrent файлов и автоматический запуск скачивания (триггер load_start), а вторая это сортировка по директориям (триггер move_complete).

Несколько строчек для .rtorrent.rc, следят за директориями music и movies:

schedule = watch_directory_music,5,5,"load_start=/disk3/fluder/rtorrent/torrents/music/*.torrent,d.set_custom1=/disk3/fluder/rtorrent/complete/music/"
schedule = watch_directory_movies,5,5,"load_start=/disk3/fluder/rtorrent/torrents/movies/*.torrent,d.set_custom1=/disk3/fluder/rtorrent/complete/movies"
system.method.set_key = event.download.finished,move_complete,"d.set_directory=$d.get_custom1= ;execute=mv,-u,$d.get_base_path=,$d.get_custom1="

Загрузка .torrent через FTP с помощью Hazel

Два правила в Hazel отслеживают источник загружаемых .torrent файлов, и загружают по FTP в соответствующие, отслеживаемые rtorrent, папки.

Наблюдаем за директорией загрузок в Hazel и передаём по FTP

Можно сделать и проще, если вы пользуетесь Google Chrome, для которого есть плагин Remote Torrent Adder.

Проверка и автоматическое списывание новых, завершённых раздач, через FTP

Cамый крутой консольный FTP клиент это LFTP, можно использовать и более продвинутый BtSync, но он доступен не у всех хостеров.

Устанавливаем:

brew install lftp

Создаём скрипт, который коннектится к FTP с помощью LFTP, проверяет есть ли новые загрузки, и если так, начинает автоматически скачивать контент. По завершению отправляем оповещение в Notification Center.

Помимо данных для аутентификации нужно указать правильные пути, что и куда будет копироваться (lcd и cd под комментариями sync movies и sync music).

mirror --use-pget-n=3 --verbose --use-cache --only-missing --recursion='newer' — использую для копирования новых фильмов, которых нет локально, рекурсия вглубь папок отключена, скачивание одного файла происходит в три потока.

mirror --parallel=10 --verbose --use-cache --only-missing --newer-than='now-1day' --recursion='newer' — копирование музыки. Рекурсивный листинг вглубь отключен, копируются файлы, которым скачаны не более, чем один день назад, параллельная загрузка до десяти файлов одновременно.

vim ~/bin/seedboxsync
#!/bin/bash

HOST="host.name"
PORT="21"
USER="user"
PASS="password"

LOCK="/tmp/lftp-sync.lock"
DISK="/Volumes/The Dump/"

trap "rm -f $LOCK" SIGINT SIGTERM

if [ -e "$LOCK" ] || [ ! -d "$DISK" ]
then
    echo "lftp sync is running already."
    exit
else
    touch "$LOCK"

    LFTP="$(
        caffeinate -i /usr/local/bin/lftp -p $PORT -u "$USER","$PASS" ftp://"$HOST" <<EOF

        # init config
        set file:charset utf8
        set pget:save-status never
        set ftp:list-options -a
        set ftp:ssl-force true
        set ftp:ssl-protect-data true
        set ftp:ssl-protect-list true
        set ssl:verify-certificate false

        # sync movies
        lcd /Volumes/The\ Dump/Movies/
        cd /rtorrent/complete/movies/
        mirror --use-pget-n=4 --verbose --use-cache --only-missing --newer-than='now-1day' --recursion='newer'

        # sync music
        lcd /Volumes/The\ Dump/.flac/
        cd /rtorrent/complete/music/
        mirror --parallel=10 --verbose --use-cache --only-missing --newer-than='now-1day' --recursion='newer'
EOF)"

    if [[ $LFTP == *"Transferring"* ]]
    then
        /usr/bin/osascript -e 'display notification "lftp sync completed" with title "Seedbox"'
    fi
    rm -f "$LOCK"
    trap - SIGINT SIGTERM
    exit
fi

Запускаем раз в минуту:

crontab -e:

* * * * * /bin/bash ~/bin/seedboxsync

Стриминг или скачивание?

С музыкой всё однозначно, FLAC мне в облаке не нужен, только скачивание.

А вот с видео я наверняка выбрал бы "streambox" и не занимался загрузкой, если бы: 1) цены были более гуманны; 2) у меня не было запросов "direct streaming" для ремюксов, повышающих требования к железу и линку.

Ни в одной приставке для клиента Plex я не нашёл возможности установить большой буфер, с возможностью "direct streaming" из mkv h264.

В Roku 4 этого нет, как и в Amazon Fire TV, про китайские свистки думать не хочется, там всё ещё хуже. В общем это вопрос на будущее, а сейчас буфером будет служить домашний компьютер, раздающий видео по DLNA.


AAC в сравнении с MP3 и FLAC

На своём "музыкальном оборудовании" я не могу отличить хороший AAC рип от lossless музыки. Однако если есть возможность, то предпочтение отдаю всё равно более громоздкому lossless, т. к. оборудование поменять легко, а собирать музыку по новой не очень.

То что AAC, как для lossy кодировщика, довольно неплох я знал давно. Вопрос только насколько, по сравнению с lossless "рипами", если рассматривать их спектр. MP3 тоже пока ещё достаточно популярен, поэтому и его пришлось включить в тестирование. Ниже небольшой отчёт, для тех кто не в теме.

Исходные данные:

Lossless мастер

Результат:

MP3 CBR 320 порезан выше 20 kHz

MP3 VBR 6 порезан под чистую выше 16 kHz

Максимальное качество MP3, VBR 0, выше 16 kHz спектр сохранился, но качество его сомнительно

Купленный в iTunes Music Store AAC очень близок к lossless

AAC 256 low, этот я сделал сам, аналогично, практические не отличается от исходника

Выводы:

AAC на спектрограмме показывает очень хорошие результаты даже c низким профилем сжатия, чего не скажешь про MP3. Рядом с FLAC место такой музыке у меня найдётся.

Впрочем глазами музыку мы не слушаем, поэтому одна спектрограмма не может выступать основным критерием оценки.


Всё про блокировку компьютера в OS X

Мой компьютер — это сейф содержащий: персональную переписку, мысли, ключи, прочую информацию, которая предназначена только для меня и ни для кого более. Жёсткий диск у меня зашифрован с помощью FireVault, и по завершению работы компьютер я блокирую, так спокойнее.

Делать это можно разными способами.

Logout

Глобальные горячие клавиши, Command ⌘ + Shift ⇧ + Q — завершение сеанса пользователя. Этот способ плох тем, что все программы завершают работы, после входа нужно ждать пока окружение запустится.

Suspend

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend

Если набрать эту команду в терминале, то компьютер будет заблокирован, но вместе с тем не будут доступны и некоторые фичи. Например MacID для разблокировки работать не будет.

Эта же команда встроена и в Alfred, как алиас "lock", впрочем им не является.

Триггер блокировки при переходе в спящий режим

Этот метод блокирует уже правильно:

1) Запускаем System Preferences.app, переходим в "Security & Privacy -> General -> Require password after sleep or screen saver begins -> Immediately", отмечаем чекбокс. Теперь по возвращению из режима сна или скрин сейвера, пароль будет запрашиватсья автоматически.

2) В "Mission Control -> Hot Corners -> Put Display to Sleep" выбираем угол, после перевода курсора в который, будет запущен спящий режим.

System Preferences.app

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

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

Комбинированный — блокировка экрана с помощью горячих клавиш, без завершения сеанса

Этот метод решает предыдущую проблему, скринсейвер не блокирует компьютер, блокировкой занимается пользователь.

Можно вывести замочек из настроек Keychain в Menu Bar и блокировать экран с помощью трекпада или мыши.

Keychain Access.app Preferences

Но этот вариант не годится для гика приросшего к клавиатуре, хочется то же поведение, но из консоли и Alfred.

Создаём "правильный" lockscreen.m:

#import <objc/runtime.h>
#import <Foundation/Foundation.h>

int main () {
    NSBundle *bundle = [NSBundle bundleWithPath:@"/Applications/Utilities/Keychain Access.app/Contents/Resources/Keychain.menu"];

    Class principalClass = [bundle principalClass];

    id instance = [[principalClass alloc] init];

    [instance performSelector:@selector(_lockScreenMenuHit:) withObject:nil];

    return 0;
}

Компилируем:

clang -framework Foundation -o lockscreen lockscreen.m

Или забираем для El Capitan бинарник, который выполняет только одну задачу — блокировка экрана из терминала, без завершения сеанса (Switch User). Я скопировал бинарник в /usr/local/bin и сделал rehash.

Готовый воркфлоу для Alfred, с уже встроенном бинарником можно забрать у меня на GitHub. Блокировка экрана по умолчанию настроена через Control ⌃ + Option ⌥ + Command ⌘ + Q.

Этот метод имеет существенный недостаток, когда крышка макбука закроется, блокировка не сработает, как в варианте с блокировкой скринсейвером. Поэтому ниже дополнительный слой защиты.

Ловушка на случай угона MacBook

Я написал маленький параноидальный скрипт, который занимается тем, что отслеживает когда крышка макбука переходит из состояния "закрыта -> открыта". Если я где-то забуду макбук, то вероятнее всего его крышку закроют, чтобы например перенести в более удобное место для изучения. После, чего сработает автоматическая блокировка.

Исходники на GitHub

Обновление 15/02/2016:

Добавил формулу в brew, теперь установка блокировщика выглядит так:

brew install glushchenko/homebrew-utils/autolock
brew services start autolock


→ Пока, XMPP!

Shutting down our XMPP chat service November 16, 2015 — Rob N Quick summary: We’ll be closing down our XMPP chat server on 31 January 2016. For users with a FastMail domain account (e.g. @fastmail.com, @eml.cc, etc), XMPP messaging with your account will be unavailable after this date. If you have your own domain for your account, you’ll have to find an alternative XMPP server and change your SRV DNS records as appropriate if you wish to continue using XMPP with your domain.

31 января 2016 года FastMail прекращает предоставлять XMPP хостинг, а следовательно и поддерживать мой JID (contact@fluder.co), переносить который я больше не буду.

Свободную нишу займёт телеграм, писать на fluder_co.


Transmission и низкая скорость записи на HDD

Подключил домой гигабитный интернет, и столкнулся с проблемой использования. Если на SSD торренты по Wi-Fi 802.11ac загружаются со скоростью до 40 МБ/сек, то на внешнем жёстком диске скорость загрузки едва достигает 10 МБ/сек.

Скорость используемого USB харда не велика, но всё же больше, чем получаемый результат. Blackmagic Disk Speed Test это подтвердил, выдав на запись до 35 МБ/сек.

Проблема в том, что Transmission работает с маленькими "чанками", размером по 4 МБ. Одновременная загрузка приводит к созданию десятков кусочков, которые непрерывно и хаотически записываются.

Жёсткий диск не справляется, механика страдает, скорость записи получается меньше скорости соединения. Изменить размер кеша в настройках нельзя, в конфиге тоже. Однако open source решает:

1. Забираем исходные коды из SVN1.

svn co svn://svn.transmissionbt.com/Transmission/trunk Transmission  

2. Открываем файл libtorrent/session.c, строка 68:

DEFAULT_CACHE_SIZE_MB = 4,

Меняем на:

DEFAULT_CACHE_SIZE_MB = 512,

3. Собираем в Xcode.

В результате эксперимента скорость записи торрента поднялась до приемлимых 25-30 МБ/сек, правда и использование памяти во время загрузки тоже возросло до ~800 МБ. Впрочем по завершению загрузки память высвобождается до привычных 20 МБ, и проблем в дальнейшем не создаёт.


  1. Запакованные исходники в tar, с главной страницы, не подойдут, в OS X они не собираются. 


Программы для OS X 2015

OS X El Capitan

Прошёл ещё один год, а значит пора написать новый пост, об интересных программах для OS 10.11 El Capitan. 

Учитывая пожелания убрал из рубрики: стандартный для OS X софт, а так же приложения, которыми перестал пользоваться.

Прошлые выпуски: 2012, 2013, 2014.


Удаление сообщений в Skype

В Skype есть такая бесполезная фича, как "Удаление cообщений". На самом деле это обман. В базе после таких удалений сообщение остаётся на месте, и его совсем не сложно восстановить.

Правильно это действие называть "Скрыть сообщение", и не вводить пользователей в заблуждение.

Проверяется просто:

1) Вам пишут уникальное сообщение "uniqueText".
2) Сообщение удаляется.
3) grep -rl "uniqueText" ~/Library/Application\ Support/Skype/

В ответ получаем dat файл, который можно просмотреть в любом текстовом редакторе и найти все что вам написали.