21 заметка с тегом

macos

Скриптование меню в статус-баре

В «Маке» очень нехватает одной вещи — лёгкого создания собственных меню в статус-баре. Учить ради этого «Обжектив-Си» или «Свифт» (и ставить «ЭксКод») мне совершенно не хочется, поэтому я поискал готовое. Нашёл ровно одно полусырое решение.

Если кому интересно, то последовательность его прикручивания к системе примерно такова (bolk — моё имя пользователя и требуется установленный brew):

mkdir -p /usr/local/Cellar/ScriptableStatusBar/0.1/bin/
mv ~/Downloads/ScriptableStatusBar-release/usr/local/bin/sbar !:2
mv ~/Downloads/ScriptableStatusBar-release/Applications/ 
    /usr/local/Cellar/ScriptableStatusBar/0.1
brew link ScriptableStatusBar
open /usr/local/Cellar/ScriptableStatusBar/0.1/Applications/

# Тут надо утянуть открывшееся приложение в «Объекты входа»
# и ещё запустить его в открывшемся окне, разрешив ему в принципе запускаться

Очень неудобно и несколько недоделано. Хотелось бы, чтобы из шелла можно было добавить/удалить пункт меню и сменить иконку. Сейчас это тоже можно, но полной переинициализацией и, кроме того, убъёшься всё экранировать.

Вооружившись несложной инструкцией, делаем несколько магических пассов:

cat>~/lockkeyboard.sh<<LOCK
#!/bin/ksh

kext=/System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext/
case "$1" in
    unlock )
        /sbin/kextload "$kext"
        ;;
    lock )
        /sbin/kextunload "$kext"
        ;;
esac
LOCK

sudo chown root:staff ~/lockkeyboard.sh
sudo chmod 750 ~/lockkeyboard.sh

sudo cp /dev/stdin /private/etc/sudoers.d/lockkeyboard<<SUDO
bolk    ALL= NOPASSWD: /Users/bolk/lockkeyboard.sh
SUDO

sbar set locker 🔓\
    'Lock:/usr/bin/sudo /Users/bolk/lockkeyboard.sh lock'\
    'Unlock:/usr/bin/sudo /Users/bolk/lockkeyboard.sh unlock'\
    'Quit:/usr/local/bin/sbar remove locker'

И получаем малофункциональную такую менюшечку для блокировки клавиатуры (кстати и увы, если компьютер с заблокированной клавиатурой, у вас уйдёт в блокировку по какой-то причине, то пароль ввести не получится, придётся перезагрузиться):

Меню блокировки клавиатуры (22.19КиБ)
Простое меню для блокировки клавиатуры

В принципе можно даже сэмулировать защёлкивание замка и смену пунктов меню «Lock» на «Unlock» и обратно (для этого нужно просто пересоздавать меню после каждой из этих команд с другими пунктами и другим замочком), но это ещё полэкрана костылей, которые мне совсем не хочется на вас вываливать.

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

Дополнение: нашёл ещё две программы: «БитБар» и «ЭниБар».

🍏 «Сиерра»

Экран неудачной установки (60.55КиБ)
Экран боли и разочарования в «Сиерре»

Ну слушайте, когда был жив Тот Мужик, такого не было. Скачал себе сегодня «Сиерру» — новую версию операционной системы для «Маков». Начался процесс установки.

Через какое-то время компьютер перезагружается и сообщает мне, что места нет. Из вариантов — только перезагрузка. Я перезагружаюсь и… попадаю снова на тот же экран.

Выкручиваться пришлось через шелл (из верхнего меню можно запустить «Терминал»), я нашёл свой диск, перемонтировал его в режиме для записи и удалил кое-что из своей домашней папки. Долго расписывать не буду, если столкнётесь с этой ситуацией, то вам пригодятся команды:

mount -u -w /dev/disk1
cd '/Volumes/Image Volume/Users'

Дальше переходите в домашнюю папку вашего пользователя и удаляете что-то, чем можно пожертвовать.

2016   macos

👁 Глаз следящий

Глаз, который следит на мышью (18.81КиБ)
Глаз, следящий за мышью в консоли

Обновилась до версии 2.9 моя любимая программа-терминал iTerm2. Изучая новые возможности, обнаружил нечто неожиданное — теперь в консоль можно выводить обычные графические изображения.

Протокол довольно простой:

ESC ] 1337 ; File = [необязательные параметры] : изображение в формате base64 ^G

Решил немного с ним побаловаться, результат на скриншоте — небольшая программа на «баше» — глаз, который следит за указателем мыши.

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

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

Для запуска требуется iTerm2 2.9 и выше и Imagemagick.

Подпилил переподсоединялку вайфая

Чуть поменял «переподсоединялку вайфая» для Мака — теперь пингуется не 8.8.8.8 (это ДНС Гугла), а адрес гейта, что более надёжно. Правда с конца октября, когда я её написал много воды утекло — вайфай у меня отваливается теперь очень редко, уж не знаю что изменилось.

Переподсоединялка вайфая

Переподсоединение (25.92КиБ)

Вышло очередное обноление «Эль Капитана» на «Маке», а проблема с вайфаем на «Макбуках Про» так никуда и не делась. Я планирую в какие-нибудь выходные переставить систему с нуля, но когда это будет, неясно — пока я не могу себе позволить оторваться от ноута так надолго, для меня он важный рабочий инструмент.

В общем, сделал себе на «Баше» утилиту переподключающую вайфай при пропадании пингов до 8.8.8.8 (это ДНС «Гугла»). Сегодня уже целый день её использую, так гораздо комфортнее.

Блокировка экрана на «Маке» из Си

Как-то я программировал на Си под «Мак» блокировку жестом перед датчиком освещения. Сегодня показывал его коллегам, оказалось ничего не работает — метод, который я использовал для вызова экрана блокировки перестал принимать на вход NULL. Тогда как в интернетах только этот способ везде и упоминается:

CGSCreateLoginSession(NULL);
// теперь выдаёт
// Assertion failed: (sid != NULL), function CGSCreateLoginSession, file Services/Connection/CGSSession.c, line 418.

Возможно в «Эль-Капитане» (последней версии «МакОСи») что-то поменялось — функция CGSCreateLoginSession считается недокументированной, никакой информации о ней мне найти не удалось.

В общем, покапался я в заголовочных файлах, подбором и интуицией родил код, который блокирует экран и под «Эль-Капитаном», заодно и утилиту свою поправил:

// получаем словарик с атрибутами текущей сессии
CFDictionaryRef dict = CGSCopyCurrentSessionDictionary();
// выбираем из него идентификатор текущей сессии, получаем его в виде int
CFNumberRef number = (CFNumberRef) CFDictionaryGetValue(dict, CFSTR("kCGSSessionIDKey"));
CGSSessionID currentSession;
CFNumberGetValue(number, kCFNumberIntType, &currentSession);
// блокируем текущую сессию
CGSCreateLoginSession(&currentSession);

Обновлённая версия лежит там же — на «Гитхабе».

«Эль-Капитан»

Никогда в жизни не ставил бета-версию «МакОСи», но пришлось. Я уже писал в твитере, что «Йосемити», текущая версия — худшее, что случалось с «Маками». Тормоза и глюки — это я понимаю, но пять минорных версий подряд не мочь исправить проблему с вай-фаем — это неимоверные перебор. Последнее обновление только ухудшило ситуацию — домашняя сеть 5 ГГц отваливается минут через 10, приходится переключаться на 2,4.

В общем, поставил себе третью бету «Эль-Капитана», пока полёт нормальный. Тормоза ушли, глюков не видно, с вай-фаем если всё и не идеально, то уж точно стало гораздо лучше. Если у кого-то схожие проблемы, крайне рекомендую перейти на бету.

2015   mac   macos

Tcl/tk и Retina

О, оказывается, можно «ретинизировать» интерпретатор Тикля — сделать так, чтобы программы на этом языке хорошо смотрелись на маковской ретине (см. скриншот).

Ретинизированный Тикль (24.29КиБ)

Для этого нужно скачать программу Retinizer и бросить в неё Wish.app, который находится в /System/Library/Frameworks/Tk.framework/Versions/Current/Resources/

Говорящие часы

Часы (53.96КиБ)

Вот очень правильная настройка есть в «Маке» (немногие её включают, а зря!) — компьютер может произносить текущее время каждый час, полчаса или четверть часа. Пользуюсь ей давно, помогает быть продуктивнее в работе.

Во-первых, помогает ориентироваться в собственной скорости (уже 11 часов, а я так мало сделал!), во-вторых, позволяет выйти из состояния «залипания» — когда мысли распозлись, взгляд расфокусировался.

По кнопке «Настроить голос…» открывается меню, в котором можно выбрать русский голос, если это требуется.

Если у вас «Мак», рекомендую включить эту настройку!

2015   macos

Русские имена на «Маке» после разархивации ZIP

Я вчера скачал несколько десятков зип-архивов, внутри которых тысячи файлов с русскими именами. Скачивал через браузер «Сафари» и этот поганец, как у него водится, услужливо мне их распаковал после скачивания. У меня время от времени вылетает из головы эта особенность, в общем, я получил кучу папок и файлов, которые выглядят вот так:

Кракозябры (17.71КиБ)

Эта давнишняя проблема «Мака», проистекающая из родовой травмы зип-архивов — этот архиватор родился ещё во времена ДОСа и для совместимости сохраняет русские имена ещё в той, ДОСовской кодировке. Правда, лет 15 назад я ковырял формат и увидел, что в каких-то метаданных лежит оригинальное имя, но должно быть «Мак» про это поле ничего не знает.

Как бы там ни было, в конце индикатора прогресса я увидел кучу файлов с нечитаемыми именами. Ничего готового я быстро не нашёл, поэтому сварганил небольшой скрипт на «баше», который восстанавливает русские имена разархивированного зип-архива.

Способ употребления такой: складываете всё испорченное в какую-либо папку и запускаете внутри fixzip. В процессе «ремонта» он будет показывать на экране восстановленные имена. Два раза запускать нельзя — имена снова будут испорчены.

2014   bash   macos   zip   программирование
Ранее Ctrl + ↓