Локализация директорий в OS X

Исходники у меня постоянно перемещаются из одной директории в другую, хотя логично было давно положить всё в ~/src и забыть, однако глаз перфекциониста цеплялся в Finder среди локализованных названий, да ещё не с заглавной буквой.

Захотелось, чтобы физически было так:

Tmux в Terminal.app

А в Finder так:

Finder

Идём в /System/Library/CoreServices/SystemFolderLocalizations/, там находим нужный проект локали (у меня это ru.lproj).

Конвертируем бинарник SystemFolderLocalizations.strings в xml:

sudo plutil -convert xml1 SystemFolderLocalizations.strings

Открываем любым текстовым редактором и добавляем в конец файла строку:

<key>src</key>
<string>Исходный код</string>

Конвертируем назад в бинарный формат:

sudo plutil -convert binary1 SystemFolderLocalizations.strings

Заставляем переводить директорию:

touch ~/src/.localized

Вуаля!


Пустые RSS подписки в Safari

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

Решается просто, добавлением к каждой записи entry > link, атрибута rel, со значением alternate.

<entry>  
    <link rel="alternate" href="http://fluder.co/blog/2015/02/21/github-organizations/"/>  
    ...
</entry>  

Очень странное решение от Apple, не принимать записи без rel, точнее это не решение, а ошибка в имплементации RFC4287, в котором чётко указано:

atom:link elements MAY have a "rel" attribute that indicates the link relation type. If the "rel" attribute is not present, the link element MUST be interpreted as if the link relation type is "alternate".

Т.е. без этого атрибута должен быть применён rel="alternate", по умолчанию. Отправил баг-репорт, может когда нибудь починят.


GitHub для организаций

Эта заметка для сомневающихся разработчиков и менеджеров проектов, которые хотят переехать на рельсы GitHub.

Пол года назад наша небольшая команда бросила redmine и погрузилась в поиски нового дома для наших проектов.

Миграция

Ключевым требованием было наличие полноценного решения для Code Review, простое ведение Issues, ну и конечно полноценная интеграция с git.

Я попробовал Jira (Stash), BitBucket и GitHub. Больше всего мне понравился последний, на который было решено и переносить проекты.

Миграция пошла достаточно просто. В сети я нашел питонячий скрипт, который пришлось немного переписать под нас, он помог быстро перенести все задачи. В GitHub установлен лимит на 5000 запросов к API в сутки, полный переезд занял два дня.

Адаптация к тикет трекеру прошла не очень легко. Непривычно и ново было всё, начиная от локализации и заканчивая выедавшими глаза метками. Для кого-то пара моментов, о которых я напишу ниже, могут быть очень важны, я был неприятно удивлен:

Важно!

  • В GitHub организациях нет гибкой системы разграничения прав пользователей. Issues проекта доступны всем, у кого есть доступ к репозиторию, и наоборот. Вы можете ограничить только запись в репо, чтение всегда открыто. Решается эта проблема криво, созданием отдельного проекта только для задач.

  • API наступает на те же грабли и не позволяет дать доступ сторонним сервисам к определенному ресурсу. Если вы предоставляете доступ к задачам, то у вас попросят и полный доступ к репозиториям. Отсюда вытекают некоторые опасения при интеграции сторонних сервисов с вашим проектом.

Проблема меток

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

Мы решили эту проблему тотальной чисткой, оставив на проект три лейбла: ошибка, критическая ошибка (должна быть выполнена вне очереди и milestone), статус аппрува задачи от менеджера (позволяет делать фильтрацию в отличии от lock).

Приоритеты были заменены на milestones. Вместо высокого приоритета теперь номер версии продукта, у которого установлены определённые сроки релиза.

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

Из хорошего

Пулл риквесты, удобная система комментирования кода (code review), автоматическое закрытие задач (коммитами и пулл риквестами), отличные сторонние клиенты к задачам, двухфакторная авторизация, фид общего потока всех действий команды. Есть возможность настроить автоматическое развёртывание для каждого нового коммита, комментирование тикетов прямо из email, markdown разметка. Нравится широкий и быстрый поиск по задачам и коду.

Если бы не странная политика с правами доступа, которые решаются через API, написанием своего простенького клиента, то я бы был доволен на 100%.


Безопасность SSH и VNC с помощью Little Snitch и VPN

Мне часто нужен удалённый доступ к маку из разных, странных и не очень, iOS программ (Prompt, VNC Viewer), которые не вызывают должного доверия. Каждый раз, когда я ввожу свой пароль от SSH или VNC, моё воображение рисует POST запрос стороннему сервису, который аккуратно сохраняет мои данные, получая безграничный контроль над моей машиной.

Решение проблемы требует небольших усилий:

1) Единая точка входа на компьютер. В Little Snitch доступ к службе launchd (sshd) ограничен только с одного IP адреса.

Little Snitch

2) Этот IP адрес принадлежит моему VPN, настроить который проще простого с помощью скрипта (одна команда).

Если у вас уже есть инстанс в DigitalOcean или Atlantic то и платить ничего не нужно. А если вы пользуетесь сторонним VPN, то можно и сэкономить обойдя стороной посредников, вроде Cloak.

iOS и OS X работает с PPTP из коробки:

iOS PPTP VPN

Даже если ваш логин и пароль уплывёт, то ничего с этим сделать будет нельзя. Работать SSH и VNC будет только с вашего VPN, к которому доступ есть только у вас.


О хранении музыки

Достаточно часто я пишу здесь о музыке, эта тема мне интересна, в особенности коллекционирование и хранение. Начиная с muz.ru, и до появления iTunes Music Store полностью легализовал коллекцию, попробовал уйму стриминговых сервисов и магазинов, о которых ниже.

Прошлое

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

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

Время шло и в 2013 году iTunes Music Store к нам пришёл официально, со всё теми же ценами в долларах. Переключивши страну все покупки были утеряны, оставив локальные копии и неприятный осадок. Музыку из-за этого я покупать не перестал, просто продолжил пользоваться, пока он меня конкретно не достал.

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

Стриминг

Spotify у меня как и у многих не прижился из-за заморочек с лицензионными соглашениями для моей страны. VPN это конечно решение, но периодически логиниться через него, и при этом платить деньги, совсем не хотелось. Как оказалось позже это не самая большая проблема.

Более или менее начал пользоваться бесплатным сервисом от Яндекс.Музыка, каталог был бедный, но выбора особо небыло.

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

Учитывая прошлый опыт с iTunes Music Store, когда из облака начали пропадать LP обложки (ошибка при загрузке), я благополучно забил на iTunes Match, чтобы не потерять свою музыку навсегда. Как оказалось сделал правильно, как раз сегодня Денис Евсюков подтвердил мои опасения.

В 2014 году появился Google Music, с большим каталогом, но без нормального клиента, попользовавшись месяц ужасными клиентами и веб интерфейсом, подписку я не продлил.

Позже я узнал о Deezer, легально работающий, с хорошим каталогом, но не прижилось.

Настоящее

Я вернулся к тому, с чего начинал пять лет назад. Только локальное хранение библиотеки, с резервными копиями на внешний жёсткий диск, в Time Machine.

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

Spotify или Deezer хороши для обнаружения интересной тебе музыки на основании определённых предпочтений, но для меня нет особой разницы, запустил я умный "Flow" из стримингового сервиса или старое бесплатное тематическое радио в iTunes. В список Shazam1 ко мне попало столько же музыки из обычного сёрфа по простому эфирному радио, как и из того же Deezer.

Сейчас я не использую ни один музыкальный "premium" сервис и не привязан ни к одному оффлайн плейлисту. Мне нужен контроль происходящего. Основной источник — Google Music, цены в котором в гривнах приемлимы, второстепенный — iTunes, который тоже иногда использую.

Будущее

Не планирую отказываться от mp3 и m4a, доверять сервисам, с закрытыми интерфейсам, которых с каждым днём будет всё больше. Сегодня облако или магазин есть, а завтра нет (привет Google). По большому счёту нет и проблем с хранением (синхронизацией), которая в крайнем случае решается большим внешним диском (более быстрой точкой доступа).

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

Возможно мне вздумается перейти к другому решению, новому плееру, хранилищу или магазину (торрент трекеру). Без потерь в коллекции, всё это достижимо только с одной моделью хранения — локальной. У многих есть крутые API, но нельзя однозначно сказать сколько они будут поддерживаться.

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


  1. Shazam — кроссплатформенная программа, для распознавания музыки. 


Фильмы из IMDb top 250

Посмотрел все фильмы из Top 250 IMDb, ниже список тех, которым после просмотра я поставил 9 и 10 баллов, снизу вверх. Цифра слева — это позиция в IMDb на 23 января 2015 года.

9 из 10

236. The Truman Show (1998)
234. Per un pugno di dollari (1964)
230. Barry Lyndon (1975)
220. Harry Potter and the Deathly Hallows: Part 2 (2011)
215. Notorious (1946)
208. Stalker (1979)
197. The Best Years of Our Lives (1946)
193. The Grapes of Wrath (1940)
192. Million Dollar Baby (2004)
187. Sin City (2005)
186. Stand by Me (1986)
173. Platoon (1986)
156. Judgment at Nuremberg (1961)
148. Rebecca (1940)
144. Gran Torino (2008)
142. El secreto de sus ojos (2009)
141. Lock, Stock and Two Smoking Barrels (1998)
131. Tonari no Totoro (1988)
127. The Bridge on the River Kwai (1957)
126. Heat (1995)
121. Boyhood (2014)
98. The Apartment (1960)
95. Per qualche dollaro in più (1965)
86. Full Metal Jacket (1987)
80. Braveheart (1995)
73. Mononoke-hime (1997)
71. Toy Story 3 (2010)
66. Vertigo (1958)
64. Aliens (1986)
63. North by Northwest (1959)
56. Django Unchained (2012)
51. Alien (1979)
48. Gladiator (2000)
37. Rear Window (1954)
36. Sen to Chihiro no Kamikakushi (2001)
32. American History X (1998)
29. La vita è bella (1997)
20. Star Wars (1977)
18. Goodfellas (1990)
15. One Flew Over the Cuckoo's Nest (1975)
12. Star Wars: Episode V - The Empire Strikes Back (1980)
8. Schindler's List (1993)
6. Il buono, il brutto, il cattivo. (1966)

10 из 10

243. Papillon (1973)
223. Rocky (1976)
216. The Terminator (1984)
172. Kill Bill: Vol. 1 (2003)
166. Hotel Rwanda (2004)
163. Dial M for Murder (1954)
161. A Beautiful Mind (2001)
160. Into the Wild (2007)
151. The Deer Hunter (1978)
119. Der Untergang (2004)
43. The Green Mile (1999)
13. Forrest Gump (1994)
9. The Lord of the Rings: The Return of the King (2003)
3. The Godfather: Part II (1974)
2. The Godfather (1972)
1. The Shawshank Redemption (1994)

Статистика

  • Проект длился три года.

  • 91 фильм из 250 я не планирую пересматривать никогда. Остальные получили оценки в 8, 9 и 10 баллов.

  • В блеклист попало бездарное, проплаченное, индийское кино, фильмы Ингмара Бергмана и частично Стенли Кубрика.

  • Лучший режиссёр top 250 — Альфред Хичкок и Хаяо Миядзаки.

  • Самые отвратительные фильмы Ran (1985), Who's Afraid of Virginia Woolf? (1966) и Persona (1966).

  • Общий хронометраж примерно ~1 месяц непрерывного просмотра.

Готов ли я рекомендовать любой из этих фильмов? Конечно нет, даже отговорю вас — не смотрите!

EOM


→ Разблокировка компьютера с помощью MacID

Не знаю как вы, но я задолбался по нескольку раз в день вводить пароль из 16 символов. Попробовал несколько решений для разблокировки MacBook с помощью телефона. Сначала расхваленный Knock, который на первый взгляд показался удачным, но на практике имеет ряд недостатков. Разблокировка постучав по телефону два раза это интересно, но постоянно колотить в телефон оказалось не лучшей идеей, плюс ко всему:

  • приложение на телефоне постоянно держит включенными геолокацию
  • периодически не выходит из спящего режима (требует перезапуска)
  • mac приложение коннектится зачем-то в интернет
  • после входа с помощью Knock ssh-agent остается мёртвым, в итоге ssh постоянно просит ввести passphrase

Пришлось запросить refund в AppStore и сделать вторую попытку с MacID, который сегодня выпустил первую версию своего решения.

Как ни странно второй лишён перечисленных недостатков. Правда немного больше действий приходится совершать, но авторизация происходит по отпечатку, а не стуком. Т.е. без вашего пальца мак не разблокировать. Работает разблокировка через Bluetooth LE, при открытии крышки отправляя уведомление на телефон. Есть автоблокировка, если телефон удаляется от компьютера.

Может со временем что-то плохое обнаружится, но теперь есть с чем сравнить, MacID однозначно лучше, чем Knock.

EOM


Pomodoro.app и Retina Dark Mode

Для хронометража рабочего времени и соблюдения перерывов, долгое время использовал Pomodoro.app от Ugo Landini. Когда переехал на rMBP эта программа выпала из обихода, во первых из-за иконок, которые не подходили для Retina дисплея, а во вторых из-за отсутствия поддержки Dark Mode в Yosemite.

Необходимость делать перерывы каждые 25 минут никуда не пропала. В AppStore ничего приличного на эту тему и в помине нет, поэтому было решено допилить старый Pomodoro.app.

Репозиторий в GitHub у этого проекта два года не видел новых коммитов, но порывшись в форках я нашёл более или менее приближённую к работе версию, добавил новые Retina иконки для Dark Mode, а так же правку для того, чтобы проект собирался. Код лежит тут, а кто не хочет заморачиваться и собирать руками, может скачать рабочую копию здесь.

EOM


Control Plane и энергосбережение в OS X

До нас в Харькове докатилась волна отключений света, и на прошлой неделе в облэнерго составили графики (которые они собственно успешно профукали, и свет так и не начали отключать)

Я не сильно переживал по этому поводу, батареи у MacBook при грамотном использовании хватает на 7 часов со включенной музыкой и wifi, но я всё же провел ревизию процессов, которые особо активно выжирают батарею.

Наиболее активными оказались:

  • Transmission
  • Arq
  • micropress
  • Keyboard Maestro
  • Better Touch Tool
  • Hazel (как ни странно ведёт себя адекватно, для него правил создавать не пришлось).

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

Для автоматизации этого процесса отлично подходит Control Plane1. Для него создается два контекста: battery и adapter, для которых выбирается необходимый набор правил:

Правила в Control Plane

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

Никаких лишних действий, полная автоматизация.

EOM


  1. Есть соответствующий cask brew cask install controlplane 


Мой софт iOS 2014

Постепенно, из года в год, на стареньком iPhone 4S у меня становилось всё меньше и меньше программ. Связано это с растущими аппетитами софта и самой iOS, отчего я как всегда докатился до минимального использования своих гаджетов.

С переходом на iPhone 6 всё в очередной раз изменилось. Те программы, от которых я давно отказался были переработаны, а с увеличением разрешения они стали снова важной частью системы. Ниже о самых интересных из них.


iOS