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

macos

Картинка в терминале

Несколько лет назад программа «айТерм2» (iTerm2, терминал для «Мака») обзавелась поддержкой графики в командной строке. Сильной необходимости в ней нет, но иногда это удобно — можно посмотреть картинку на удалённом сервере, не выкачивая её себе.

Вообще уже очень давно существует формат «Сиксел», рождённый в незапамятные времена компанией «ДЭК» (DEC), его даже поддерживают некоторые терминалы, но он значительно сложнее придуманного авторами «айТерма2».

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

Картинку с надписью «HELLO» видно сразу и в графической среде, и в терминале

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

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

Для этого я нарисовал небольшой ГИФ и вставил закодированную картинку после изображения следующей командой:

cat test.gif \
    <(echo -ne "\033[3F\033[J\033]1337;File=inline=1:") \
    <(base64 test.gif) \
    <(printf "\a")\
> test2.gif

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

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

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

29 августа   gif   macos   программирование

Общение через AirDrop

Окно программы «ЭйрДроп» на моём ноутбуке, я в сети в гордом одиночестве

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

Причины популярности «ЭйрДропа» в этом качестве — отсутствие цензуры, быстрое общение с теми, кто рядом, способ безнаказанно вторгнуться в личное пространство незнакомого человека и прочие бесценные для многих подростков возможности.

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

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

2019   macos

sudo по отпечатку пальца

Запрос отпечатка пальца для команды sudo

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

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

И вот сегодня один из сотрудников спросил — работает ли у меня на «Маке» sudo по отпечатку пальца.

Что-то я даже не задумывался о такой возможности, погуглил, оказывается это элементарно включается: нужно в файл

/etc/pam.d/sudo

первой строкой добавить

auth sufficient pam_tid.so

И всё, при следующем запуске sudo можно просто приложить палец к сканеру. Экономит уйму времени, спасает от опечаток, никто не сможет подсмотреть пароль.

Проблема с обновлением «МакОСи»

Камрип неудавшегося процесса обновления «МакОСи» на предпоследнюю версию «Мохаве»

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

Выбрал «прошку» этого года, привёз домой и приступил к переносу данных со старого ноута на новый. На «Маках» это просто — есть ассистент миграции. Одна подробность — версии операционной системы должны совпадать, а у меня различаются — на прежнем «маке» новее.

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

Но на этом приключения не закончились. Оказалось трёхгиговая программа для обновления хочет что-то скачать из интернета (это удалось понять из логов, которые у неё показываются по нажатию ⌘+L) и это что-то немаленькое — бесплатного «випиэна» на 500 мегабайт не хватило.

Хорошо приятель (спасибо, Рим!) выручил, дал пароль от своего безлимитного «випиэна», после этого меня ждал успех. До часу ночи суммарно провозился.

2018   apple   mac   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);

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

Ранее Ctrl + ↓