→ Программы для macOS 2016

В этому году я решил не писать традиционный пост о программах, которые я использую в macOS. Причины на это две:

1) Павел Мирошниченко написал прекрасный пост на эту тему, который я рекомендую.
2) Написание таких заметок отнимает уйму времени и сил, которого сейчас нет.

Павлу респект, он смог ;-)


Обзор медиаплеера Dune HD Solo Lite

Мой парк железок недавно пополнился и я решил сделать небольшой обзор нового медиаплеера от Dune.

Инженерами сделан упор на 4K и FullHD видео, 24 bit аудио и прочее. Подробную спецификацию вы можете узнать на официальном сайте.

Основные юскейсы для этого устройства — это телевидение и просмотр FullHD и UltraHD видео, ниже только о них.

Dune HD Solo Lite

Стриминг

Вы ещё записывает видео на флешку? Тогда мы идём к вам. По моему скромному мнению, лучшее место для хранения видео — NAS, есть тут конечно и USB порт, но ничего о нем рассказать не могу.

В качестве сетевого хранилища у меня выступает старенький iMac с подключенным внешним жестким диском (стомегабитный линк) и MacBook с SSD (гигабитный линк), на случай если нужно что-то скачать побыстрее.

Dune поддерживает три варианта внешних источников: NFS, Samba, DLNA.

Не рекомендую использовать Samba. Сервер в macOS, поднятый по умолчанию, не будет работать с дюной.

NFS очень просто настраивается и решает 99% вопросов, например таких как проигрывание Blu-ray из папок.

Совсем экзотические форматы плеер может не понимать, тест не прошли пара m4v видео. Для таких редких случаев есть смысл держать DLNA, для macOS рекомендую minidlnad, который умеет перепаковывать контейнер не лету.

Телевидение

Я смотрю телевидение: несколько передач, иногда футбол и пару сериалов, которые идут на каналах Amedia и Fox.

Обычные плейлисты не интересны, когда есть OTT.

В данный момент я тестирую сервис от OTTClub. За 10 $ в месяц они предоставляют доступ примерно к 160 украинским и русским телеканалам + архив за последние три дня.

OTTClub Middleware

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

Зависимость от торрентов этот сервис явно у меня уменьшил.

H.265/HEVC

Уже больше года как запустился UltraHDClub, контент которого 4K рипы от Netflix, так же есть и просто качественные сканы старых пленок, закодированные в H265.

У меня нет 4K телевизора, но качать рипы небольшого размера, сравнимые по качеству с Blu-ray хочется, поэтому поддержка H265 очень кстати, за ним будущее.

Прийдет время и будет взломан UltraHD Blu-ray.

Платные функции

Пробный период бесплатно, далее 1.99 € в месяц или по подписке.

Полноценная поддержка меню на Blu-ray образах

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

Впрочем Blu-ray из папок можно смотреть и так, бесплатно. Даже не знаю, нужно ли за это платить ради одних допов.

Коллекции

Переваривание вашей коллекции, по примеру Plex, библиотека подключается к USB диску или NFS, индексирование запускается руками, далее получаем распознанные фильмы с постерами, актерским составом, описанием и трейлерами.

Dune HD My Collection

Задумка хорошая, но ручное переиндексирование мне не очень нравится. Распознавание работает хорошо, из пары десятков фильмов распознаны были все, несмотря на отсутствие мета данных и странных названий в файлах.

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

Полезные мелочи

  • удобный пульт
  • управление громкостью по HDMI
  • быстрая перемотка
  • запоминание позиций и продолжение проигрывания c NAS

Сетевые интерфейсы

Телевидение по Wi-Fi бегает без сбоев, в том числе FullHD каналы. Тяжелое видео в виде Remux и 4K тормозит.

Поэтому выбор стоит таким образом — если нет физической возможности проложить кабель и вам нужен именно Wi-Fi, то брать нужно Dune HD Solo 4K, с гигабитным вайфаем. Если это не критично, то 1 Gbit/s Ethernet в Dune HD Lite закрывает вопрос.

! Если дома есть старый роутер, например Airport Express, то можно подключить его к плееру и использовать как мощную Wi-Fi карту.

Цена

Проигрыватель обойдется вам 200 € (~6500 грн), стоимость старшей модели Dune HD Solo 4K – 300 € (~9500 грн).

Стоит ли "ac" Wi-Fi и место для жесткого диска внутри, у старшего брата, 100 €? Я считаю нет, поэтому выбрал Dune HD Solo Lite.

В заключение

Кроме вышеупомянутых m4v файлов, которые я спокойно проигрываю через DLNA и отсутствия HDMI-CEC (а нужен ли он?) мне особо и придраться не у чему.

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


Проброс буфера обмена vim через SSH, в системах linux ⟷ macOS

Тем кто часто работает с vim/emacs через SSH, наверное приходилось сталкиваться с проблемой недоступности буфера обмена с хоста на сервере и наоборот.

Например в vim на сервере я выхожу из режим редактирования — ESC, нажимаю v, выбирают текст, копирую — y. В "clipboard" на macOS не попадает ничего. Можно выбрать необходимый текст трэкпадом или мышкой прямо в терминале, но тогда если включена нумерация строк, будут скопированы и они.

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

Настройка macOS

XQuartz

Устанавливаем XQuartz. Запускаем /Applications/Utilities/XQuartz.app, в настройках выбираем Update Pasteboard immediately when new text is selected.

Настройки XQuartz в macOS

ssh

В ~/.ssh/config добавляем интересующий хост и строку ForwardX11:

Host scaleway
    Hostname example.fluder.co
    Port 2200
    ForwardX11 yes

Настройка linux

xorg

На сервере должен быть установлен xorg:

sudo apt-get install xorg

vim

vim должен быть собран с поддержкой clipboard. Проверяем vim --version | grep clipboard.

sudo apt-get install vim-gtk

В .vimrc добавляем:

set clipboard=unnamed

sshd

По умолчанию X11Forwarding разрешен, /etc/ssh/sshd_config:

X11Forwarding yes
X11DisplayOffset 10

Проверяем xauth

Пробуем подключиться к серверу по ssh и командуем echo $DISPLAY, если всё ок, то в ответ мы увидим "localhost:10.0".

Убираем иконку XQuartz из Dock

Теперь каждый раз, когда вы будете подключаться к ssh серверу с опцией -X или равнозначному в конфиге, ForwardX11, будет запускаться XQuartz. Я предпочитаю его не показывать в доке.

sudo plutil -insert LSUIElement -integer 1 /Applications/Utilities/XQuartz.app/Contents/Info.plist

Чтобы изменения вступили в силу перегружаем программу.


CLI

Двойные оповещения в Telegram

Этот баг тянется у меня с iOS 8, на каждое новое сообщение приходит две нотификации. Google подсказал что я не один, ошибке подвержены все версии выше iOS 8, но проявляется она далеко не у всех.

Например обсуждение темы на reddit.

Или в Twitter:

Joshoon @Joshoon @telegram I am getting double notifications (Sometimes even three) for every single message on iOS. More people are having this problem. TwitterJuly 31st, 2015 at 12:22

Ещё в Twitter:

Marco De Nadai @denadai2 @telegram There are problems with notifications. I have double notifications on the iPhone and I have to enter in the chats to hide them

ctrld упоминал об этом баге тоже, в подкасте ZeroIQ и слак Apple-Russian . Я писал репорты, думал так на всех iPhone 6, но нет, а решается вопрос очень просто:

1) Удаляем приложение и данные.

Settings -> General -> Storage & iCloud Usage -> Telegram -> Delete All

2) Перезагружаем телефон.
3) Устанавливаем Telegram.
4) Profit!


iOS

Управление конфигурационными файлами 2016

Несколько лет назад я уже рассказывал как храню и управляю конфигурационными файлами, они же .dotfiles.

Установка происходила очень просто:

git clone https://github.com/glushchenko/dotfiles.git ~/.dotfiles  
cd ~/.dotfiles && ./bootstrap.sh

После чего все конфиги из репозитория, сохранялись в ~/.dotfiles и линковались в домашний каталог (~/).

Исправить конфиг и закоммитить изменения в репозиторий, а потом обновить на нескольких машинах, с таким подходом очень просто. Не нужно придумывать сложные конфигурационные файлы или тянуть тяжелые зависимости, типа ansible.

За время использования данного подхода было выявлено несколько недостатков:

  • На linux машинах разворачивался мусор (например ненужные конфиги для macOS, хранящиеся в этом же репозитории). Они не мешают конечно, но глаз постоянно за них цепляется.

  • Загрузку и установку зависимостей, например zsh, нужно делать отдельно, после чего руками переключаться на zsh.

Решение

Поведение скрипта bootstrap.sh полностью сохранено, добавлены две важные для меня фичи:

1) Линковка определенных сетов конфигурационных файлов (мои конфиги .dotfiles/bundle), в зависимости от необходимого окружения.

Теперь у меня на mac запуск bootstrap.sh происходит так:

./bootstrap.sh macOS

# или путь к бандлу

./bootstrap.sh bundle/macOS

А так выглядит конфиг бандла ~/.dotfiles/bundle/macOS:

.gitconfig  
.microrc  
.vim  
.vimrc  
.tmux.conf  
.tmux.macOS.conf  
.zsh  
.zshrc  

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

2) Написание собственных скриптов, которые бы запускались перед линковкой. Мне это нужно для предустановки самих программ, перед линковкой конфигов к ним. Например запускаем линковку бандла macOS:

./bootstrap.sh bundle/macOS

Далее происходит проверка, на существование исполняемого скрипта bundle/macOS.sh, и если он существует, то bootstrap.sh его исполняет.

Например я написал себе bundle/macOS.sh для сета macOS, который проверяет установлен ли brew, и если нет, то устанавливает его и зависимости:

#!/usr/bin/env bash

# install brew if not exist
if [ ! -f $(which brew) ]
then
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    # update packages
    brew update

    # install packages
    brew install tmux
    brew install reattach-to-user-namespace
    brew install minidlna
    brew install vim
    brew install dnsmasq
fi 

Или базовая настройка linux (debian based) машины — bundle/linux.sh:

#!/bin/bash

sudo apt-get update
sudo apt-get install -y tmux vim zsh

chsh -s $(which zsh)

Устанавливает tmux, vim и zsh, переключает терминал по умолчанию на zsh.

⭐️ Примеры в репозитории на GitHub


CLI

Украинская раскладка клавиатуры для Mac

Некоторое время использовал типографскую раскладку Бирмана, в ней мне нравился ремап точки и запятой, на слэш и вопроc1.

Всё хорошо, но украинским языком я тоже пользуюсь, а подключать третью раскладку не хочется, сами понимаете почему. Решение я нашёл на GitHub: дополненную русскую клавиатуру с украинскими буквами, если зажать Option. На её основе, для себя, я сделал2 модификацию, в которую вошли:

  • украинские буквы с зажатым Alt (їґєі), как в оригинальной украинской раскладке
  • точка и запятая перенесены на место вопроса и слеша, и наоброт, как в раскладке Бирмана
  • типографика сохранена (перенесены в другое место только квадратные скобки)
  • русские буквы как в оригинальной русской раскладке на Mac (буква ё на месте, справа)
  • добавлен знак национальной валюты ₴
  • клёвая иконка украинского флага, вместо страшных "серпов Бирмана"
По умолчаниюShiftAlt

Репозиторий на GitHub

Чтобы установить, скопируйте файлы в ~/Library/Keyboard Layouts/ и выберите раскладку в настройках System Preferences -> Keyboard -> Input Sources -> Others -> Ukrainian (Russian).

Обновление 19/09/2016:
Тема жуткий баян, ctrld оказывается написал об этом шесть лет назад, а я только допёр. Пост удалять не буду, вдруг кому-то пригодится 😜

  1. В обычной русской раскладке Mac и PC неудобно набирать точку и запятую, через комбинацию цифр + Shift (или Control + Option) 

  2. Сборка произведена при помощи Ukelele 🍻 


Заказ такси с помощью мобильных приложений в Украине

Я часто пользуюсь услугами такси, так как своего автомобиля у меня нет и не планируется.

До недавнего времени процедура заказа машины была чудовищной, и состояла из череды перезвонов с оператором. Конечно, давно ждал Uber и мониторил AppStore на предмет приличных приложений.

Фонящие гарнитуры, неразборчивое бубнение марки и номера поданой машины, обрывы связи, нежелание отправлять оповещения на мой любимый 3Mob, практически полная невозможность отменить заказ — остались в прошлом.

Время подачи автомобиля сократилось колоссально, стоимость тоже немного. Среднее время, за которое берут заказ ~4 минуты, ещё 5 минут едет машина.

Нравится

1) OnTaxi (Киев, Харьков, Одесса, Львов, Запорожье)

Минимально простое приложение. Отзывы, возможность выбрать класс авто, отслеживание такси на карте. Есть быстрый повторный заказ из истории.

Скачать для iOS
Скачать для Android

2) Shark Taxi (во всех крупных городах Украины)

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

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

Скачать для iOS
Скачать для Android
Заказать такси в веб

Чёрный список

  • Любимое такси (нет приложения в AppStore Украина, как так?)
  • Мотор (нет приложения для iOS)
  • Etaximo, оно же 3040 (есть очень странное приложение, в котором можно оплатить картой наперёд — ага, "сейчас")
  • Taxioma (не обновлялось с 2014 года)

Альтернативные службы

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

  • Hopin и Uber (Киев)
  • Uklon (Киев, Одесса, Днепр, Львов)

Есть что-то лучше? Дайте знать.


Бюджетный seedbox своими руками

Раньше я уже писал про то, что пользуюсь seedbox. Сейчас коротко о том, как создать свой, но дешевле.

Недавно перевёл часть своих домашних проектов в Scalaway. За 2.99 € в месяц они дают: 2 ядра, 2 ГБ памяти и 50 ГБ на жёстком диске. Место можно докупить по 1 € за каждые 50 ГБ сверху. Машины работаю очень быстро, никаких проблем за несколько месяцев использования у меня не было.

Решил попробовать их для раздачи торрентов. Сначала поднял машину с Ubuntu 16 и подтянул Docker.

Добавил авторизацию ключами:

# генерируем ключик без "passphrase"
ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa_simple -q -N ""  

# загружаем на удалённую машину
cat ~/.ssh/id_rsa_simple.pub | ssh fluder@scalaway 'mkdir -p -m 700 ~/.ssh; cat >> ~/.ssh/authorized_keys'

Установка

За основу взял Dockerfile от kfei:

git clone https://github.com/kfei/docktorrent  
cd docktorrent    

Задаём пароль для авторизации пользователя в ruTorrent:

vim Dockerfile

RUN htpasswd -cb /usr/share/nginx/html/rutorrent/.htpasswd username password

Билдим:

docker build -t docktorrent .

Запускаю в tmux:

docker run -it \
    -p 80:80 -p 45566:45566 -p 9527:9527/udp \
    --dns 8.8.8.8 \
    -v /data-store:/rtorrent \
    -e UPLOAD_RATE=1024 \
    docktorrent

Выгрузка torrent файлов

Отслеживаем директорию Downloads на Mac c помощью Hazel и отправляем торрент файлы в rTorrent. Кому нужно, тоже самое можно сделать в Automator.

Выгрузка торрентов с помощью Hazel и scp

Embedded script:

scp -i ~/.ssh/id_rsa_simple "$1" fluder@scaleway:/data-store/watch/

Загрузка завершённых раздач

crontab -e

* * * * * rsync -rvz --ignore-existing -e "ssh -i $HOME/.ssh/id_rsa_simple" fluder@scalaway:/data-store/finished/ /Volumes/The\ Dump/FLAC/

Итого

Достаточно скачать torrent, раздача автоматически начнётся и по завершению будет загружена в мак. У меня всё льётся прямо на жёсткий диск AirPort.

За месяц использования хостер меня не выгнал, если выгонит, то развернуть seedbox из Dockerfile в другом месте, не будет проблемой.


Swinsian — лучший музыкальный проигрыватель для macOS

Предистория

Всё что произошло с iTunes в последние годы я комментировать не хочу, кому нужен этот яд? Долго боролся, конвертировал музыку в ALAC, но в итоге всё же пришлось уйти с этого комбайна.

На ноутбуке жёсткий диск у меня не очень большой (256 GB), и с каждым добавлением новой музыки места становилось всё меньше и меньше. Выход есть — внешний жёсткий диск.

Проблема:

  • Лишнее действие отключать и подключать, если переносишь в другую комнату или забираешь с собой.

Решение:

  • Подключить к AirPort Extreme через USB, и играть музыку по сети из шары. Да, это работает с iTunes, даже на AirPlay можно отправлять, что важно для меня.

Проблема:

  • диск засыпает и iTunes отваливается, старые треки конечно играют, но импорт из Automator уже не работает. Нужно руками по новой добавлять путь к iTunes Media Library. В сети есть пара решений, со сбросом конфига iTunes, но мне они не понравились.

Решение:

  • Не использовать iTunes, переходить к Swinsian. Он ничего не теряет и прекрасно импортирует треки в автоматическом режиме, даже с удалённого диска.

Бонусы

  • нативная поддержка FLAC, MP3, AAC, ALAC, Ogg Vorbis, WMA, WAV, Opus, AC3, AIFF, MusePack и APE
  • возможность хранить библиотеку, изменяя теги, без модификации самих файлов на жёстком диске, а следовательно иметь полноценный бэкап для раздачи (если понимаете о чём я :)
  • автоматически подтягивает обложки

Swinsian

Лучший музыкальный проигрыватель для macOS

Swinsian — аскетичный музыкальный проигрывать, который умеет играть всякие странные, и не очень, форматы музыки, на которых обламывается iTunes.

С первого взгляда проект кажется заброшенным, последнее обновление в блоге за 2015 год. Но если посмотреть внимательнее, последняя версия от 28 февраля 2016.

Киллер фичи

Два режима управлениями тегирования музыки

1) Без записи в файлы. Данные хранятся в SQLite базе (~/Library/Application Support/Swinsian/Library.sqlite).

  • (+) Можно упорядочить и подписать все альбомы, при этом оставив возможность раздавать торренты, ну или просто иметь их полноценный бэкап, т.к. чек-суммы всех файлов останутся неизменными.

  • (−) При переезде в другой плеер отсутствующие теги придётся прописывать по новой.

2) Модификация тегов в файлах.

Два режима хранения

1) Библиотека.

В этом случае структура на жёстком диске будет примерно как в iTunes (~/Music/Artist/Album/).

2) Внешний источник.

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

Проблемы и решения

  • Обложки подтягивались не всегда. Например по умолчанию для Megadeth — Dystopia подтягивается анимированный gif. Такой формат плеер не понимает и не показывает ничего. В таком случае можно и руками поправить, подсунувши PNG или JPG.

  • Если в директории с треками лежит файл cover.jpg, то приоритет будет отдан ему. Если его нет, тогда Swinsian полезет в интернет, искать обложку для указанного в тегах альбома. Если в тегах название не точное, то и результата не будет (например дописано CD2).

Итого

30 дней можно пользоваться бесплатно, далее 19.95 $. Со второй попытки я таки перешёл полностью. По умолчанию конечно UI не очень, но подстроить под себя его вполне можно.

Рекомендую всем, кто до сих пор угарает по хранению музыки локально, да ещё в экзотических форматах.

Обновление 02/08/2016:
Стоило написать пост и вышло большое минорное обновление 1.12.0.

Бесплатные сертификаты SSL от Let's Encrypt и их автоматическое развёртывание в Amazon S3 (CloudFront)

Подключил к блогу бесплатный SSL от Let's Encrypt, попутно настроив CloudFront (это такой CDN от Amazon) для S3, рецепт ниже.

1) В Amazon IAM создаём нового пользователя.

Добавляем полиси, где прописываем используемый бакет.

Или можно просто разрешить запись/чтение бакета + IAMFullAccess и CloudFrontFullAccess.

2) Устанавливаем aws клиент для OS X.

brew install awscli

Создаём конфигурацию с ключами созданного пользователя в амазон:

aws configure

Зависимость нужна для того, чтобы Boto 3, используемый в плагине letsencrypt-s3front (о нём ниже), подтягивал ключи из конфига, а не переменных, есть такая у них фича:

The mechanism in which boto3 looks for credentials is to search through a list of possible locations and stop as soon as it finds credentials. The order in which Boto3 searches for credentials is:
1. Passing credentials as parameters in the boto.client() method
2. Passing credentials as parameters when creating a Session object
3. Environment variables
4. Shared credential file (~/.aws/credentials)
5. AWS config file (~/.aws/config)
6. Assume Role provider
7. Boto2 config file (/etc/boto.cfg and ~/.boto)
8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured.
Each of those locations is discussed in more detail below.

3) Устанавливаем клиент для letsencrypt.

pip install letsencrypt  

Так как сертификат выдаётся всего на три месяца, заниматься ручным2 обновлением нет никакого желания. Поэтому устанавливаем:

pip install letsencrypt-s3front

Который будет заниматься обновлением ключей в letsencrypt и их установкой в CloudFront.

4) Создаём CloudFront запись в AWS.

Alternate Domain Names (CNAMEs): fluder.co Default Root Object: index.html

Из общего списка копируем ID, пример: E31RB28LMK1L41

5) Получаем сертификаты и загружаем в CloudFront по полученному выше ID.

letsencrypt --agree-tos -a letsencrypt-s3front:auth --letsencrypt-s3front:auth-s3-bucket fluder.co --letsencrypt-s3front:auth-s3-region eu-central-1 -i letsencrypt-s3front:installer --letsencrypt-s3front:installer-cf-distribution-id E31RB28LMK1L41 -d fluder.co

6) Возвращаемся в CloudFront и выбираем загруженный сертификат.

Custom SSL Certificate: le-fluder.co Custom SSL Client Support: Only Clients that Support Server Name Indication (SNI)

7) Автообновление в крон (1 раз в месяц):

crontab -e

# fluder.co letsencrypt SSL

0 0 1 * * /usr/local/bin/letsencrypt --agree-tos -a letsencrypt-s3front:auth --letsencrypt-s3front:auth-s3-bucket fluder.co --letsencrypt-s3front:auth-s3-region eu-central-1 -i letsencrypt-s3front:installer --letsencrypt-s3front:installer-cf-distribution-id E31RB28LMK1L41 -d fluder.co --renew-by-default --text

8) В Route53 к A записи fluder.co выбираем алиас CloudFront. Сразу он не доступен, нужно подождать пока CDN развернётся полностью.

9) Для блога, Default Root Object: index.html будет работать только в корне, субдиректории выше будут игнорироваться1, это может сломать ссылки без index.html в конце URL.

Исправляется в CloudFront -> Origins -> Origin Domain Name

Не правильно — fluder.co.s3.amazonaws.com
Не правильно — fluder.co.s3.eu-central-1.amazonaws.com
Правильно — fluder.co.s3-website.eu-central-1.amazonaws.com


  1. Рецепт взял у kf 👍 

  2. В ручном режиме нужно проходить верификацию от letsencrypt, но если у вас свои сертифкаты, то проще сделать как рекомендует wallin.