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

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

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

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

По умолчанию

Shift

Alt

Репозиторий на 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


Раздача EV-DO интернета от Интертелеком на Xiaomi Mi Router Mini

Периодически мне приходится раздавать интернет за городом. Несколько лет эти задачи решал портативный CDMA модем и Wi-Fi точка доступа в одном лице — Novatel MiFi 2200.

Решение так себе, во первых потому, что это EV-DO Rev. A, до 3.1 Мбит/сек, а во вторых Wi-Fi очень слабый, плохо пробивает стены, периодически отваливается.

Отдельный Wi-Fi роутер напрашивался сам, а тут и железка подвернулась Xiaomi Mi WiFi Router Mini . У него есть USB порт, к которому на сторонних прошивках можно подключить модем. За 28 $ (доставка включена в стоимость) обещали аж 1167 Мбит/сек (да уж, столько-то и роутеры Apple не выдают :)

За годы использования Airport Express и Extreme я так отвык от прошивок и других приключений, что пройти мимо такого эксперимента я не мог, поэтому заказал белую версию Mini на eBay.

Со времени заказа прошло три недели, небольшая коробочка лежала у меня на столе:

Xiaomi Mi WiFi Router Mini

Немного погуглив, нашёл несколько вариантов прошивок от некоего Padavan, в котором уже встроена поддержка модемов из коробки. На счастье эта "firmware" сделана не для людей. Фанаты предлагают поднять виртуальную машину и скомпилировать самому. Спасибо, но нет, лучше уж чистая классика.

OpenWrt

Устанавливаем dev прошивку совместимую c SSH патчем

Чтобы получить SSH, нужно поставить dev прошивку, подозреваю, что можно это сделать прямо из веб морды, но я всё делал через USB.

  • записываем на флешку прошивку отсюда, название в USB накопителе miwifi.bin
  • подсоединяем к роутеру в USB порт
  • отсоединяем питание
  • зажимаем техническую кнопку булавкой сзади, включаем питание, удерживая булавку, пока не начнёт мигать жёлтый диод

Перезагрузка.

Устанавливаем SSH патч

Создаём аккаунт на сайте Xiaomi. Это нужно, чтобы получить персональный патч SSH открывающий root доступ к девайсу.

  • регистрируем роутер и забираем патч в своём аккаунте, на этой же страничке будет и root пароль
  • записываем на флешку с именем miwifi_ssh.bin
  • подсоединяем к роутеру в USB порт
  • отсоединяем питание
  • зажимаем техническую кнопку булавкой сзади, включаем питание, удерживая булавку, пока не начнёт мигать жёлтый диод

Перезагрузка.

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

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

ssh root@192.168.31.1 # пароль на странице где вы забирали SSH патч
cat /proc/mtd # смотрим куда писать прошивку, у меня это раздел OS1  
cd /tmp  
wget https://downloads.openwrt.org/chaos_calmer/15.05.1/ramips/mt7620/openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin 
mtd -r write openwrt-15.05.1-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin OS1  

Роутер уходит в ребут, сети пропадают, до тех пор пока мы не подсоединимся к WAN порту кабелем и не создадим Wi-Fi сеть. Подключаем кабель, настраиваем Wi-Fi интерфейсы, подключаемся через Wi-Fi, возвращаем назад интернет через WAN (это понадобится для установки дополнительных пакетов).

Настройка 3G модема

У меня в роли модема так и остался MiFi Novatel MiFi 2200, только подключенный по USB.

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

Я поставил три рекомендуемых пакета прямо из веб морды OpenWrt LuCI:

luci-proto-3g - вставляет в веб-интерфейс выбор "UMTS/GSM/CDMA-EVDO" при создании интерфейса;
kmod-usb-serial-option - добавляет поддержку переключаемых USB-устройств (модемов);
usb-modeswitch - программа для переключения режима модема;

В Network -> Interfaces -> WAN появляется протокол UMTS/GPRS/EV-DO.

Настройка модема Novatel в сети Интертелеком на OpenWrt

Логин/пароль для интертелекома — IT, номер дозвона #777.

На этом настройка закончена, модем подсоединяется и начинает раздавать интернет.

Sat Jun 11 13:49:06 2016 local2.info chat[14218]: send (AT^M)
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: expect (OK)
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: AT^M^M
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: OK
Sat Jun 11 13:49:06 2016 local2.info chat[14218]:  -- got it
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: send (ATZ^M)
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: timeout set to 30 seconds
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: expect (OK)
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: ^M
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: ATZ^M^M
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: OK
Sat Jun 11 13:49:06 2016 local2.info chat[14218]:  -- got it
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: send (ATDT#777^M)
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: expect (CONNECT)
Sat Jun 11 13:49:06 2016 local2.info chat[14218]: ^M
Sat Jun 11 13:49:10 2016 local2.info chat[14218]: ATDT#777^M^M
Sat Jun 11 13:49:10 2016 local2.info chat[14218]: CONNECT
Sat Jun 11 13:49:10 2016 local2.info chat[14218]:  -- got it
Sat Jun 11 13:49:10 2016 local2.info chat[14218]: send (^M)

Xiaomi по скорости хоть и даёт реально не более 100 Мбит/сек через Wi-Fi, но этого вполне хватает, т.к. в данном случае бутылочным горлом является Интертелеком. Зато покрытие приличное, больше чем у любого MiFi, стабильность подозреваю тоже.

Выводы

Для раздачи интернета с 3G модема не нужна дорогая точка доступа. С Xiaomi соотношение цена/качество вполне оправдывает вложенные 28 $, а если у вас есть несколько часов и желание поковыряться, то вообще отлично.


Copied — менеджер буфера обмена

С пол года как пользуюсь Copied. Это такая штука, которая сохраняет к себе в базу всё то, что вы копируете в системе через буфер обмена, он же cmd+c. Работает на OS X и iOS.

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

Copied — менеджер буфера обмена

Как я это использую?

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

В последнее время одноразовые ссылки тоже отправляю в Copied, оставшуюся часть в Safari Reading List, Pinboard почти забросил.

По умолчанию я настроил программу так, чтобы она не сохраняла всё подряд, для этого мне хватает возможностей буфера Alfred. Когда нужно что-то записать в Copied на OS X приходит на помощь шоткат ctrl+s. В iOS запуск самого приложения.

Отключаем автосохранение

Можно ведь создать закладку?

1) Вытащить ссылку можно далеко не для всего, например некоторые странички на джаваскрипте или инлайн изображения.
2) Закладки будут накапливаться, их нужно чистить. Буфер у Copied ограничен, от 10 до 1000 записей, старые записи уходят в /dev/null автоматически.

Возможностей у программы много:

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

Баг в Java приложениях (поймал в IntelliJ IDEA)

Есть у программы неприятный баг, который проявляется в приложениях написанных на Java. При вставке из буфера обмена данные вставляются дважды. Этот вопрос я задал Кевину, автору программы, ответ не заставил себя долго ждать. Решается очень просто, Java в системе должна быть не старее 1.8.0_61, проверяем с помощью java -version. В настройках напротив "compatibility mode" флажок должен быть снят.

Обновляем Java:

brew cask install java

После обновления ошибка пропадает.


Про YouTube

Часто получаю в Telegram и других мессенджерах ссылки на YouTube, и мне хочется плеваться. Я не сноб, если кто-то из друзей посчитал, что мне будет это интересно, то скорее всего так и есть, но!

Мне жалко тратить время и силы на просмотр роликов длиннее трёх минут. Да, при желании конечно всегда можно выкроить время, но нет желания, и вот почему:

1) Видео очень заторможенный способ передачи информации. Хотите передать что-то? Лучше чтения сухого текста для обзоров железок, технологий, докладов, ничего до сих пор нет. Пробежавшись по заголовкам и выборочно по самому тексту, можно понять интересно тебе это или нет. Огромная экономия времени, которое можно потратить на п. 3.

2) От чтения глаза тоже устают, и тут приходит на помощь формат аудио. Подкасты удобно слушать метро или на прогулке. Это те случаи, когда чтение и просмотр видео недоступны. Можно с лёгкостью пожертвовать скучной картинкой докладчика, его бесполезной жестикуляцией и мимикой, и ничего не потерять при этом.

3) Отсутствие отклика. Никакой ролик не заменит общения с человеком или поисковой системой. Смотреть 40 минут обзор айфона или нагуглить ответ в "спеке" за 10 секунд? Ответ очевиден, просто спроси, когда тебе это нужно. Конечно, пример с айфоном сильно утрированн.

Выводы? YouTube не нужен! :trollface:, ну почти :-)

Хотите чем-то поделиться? — напишите кратко своими словами, они будут в сто раз дороже любого сорокаминутного видео.


→ Подкаст ZeroIQ

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

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

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


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

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

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

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

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