Pull to refresh

Изучаем иностранные выражения (и не только)

Reading time 4 min
Views 2K
В этой заметке я расскажу как использовать GrowlNotify, Launchd и AppleScript для периодического вывода всплывающих сообщений (на примере классических латинских выражений). Заметка рассчитана на новичков, профессионалы вряд ли найдут для себя что-то новое.

Для всех вышеупомянутых инструментов дан краткий обзор, чтобы вы могли с минимальными усилиями сделать именно то, что вам нужно — напоминания о событиях, новых сообщениях из социальных сетей, мониторинг и диагностика сетевых сервисов и т.п. Либо можно просто сделать все так, как я описал, и через какое-то время похвастаться друзьям своим знанием латинских фраз. Scientia potentia est.

GrowlNotify

Growl — это программа для вывода нотификаций, хорошо известна всем пользователям Adium. Ее аналог в Ubuntu — пакет notify-osd. Естественно, есть возможность работать с ней не только через API, но и через командную строку (используя вышеупомянутую утилиту).

Устанавливаем утилиту GrowlNotify из Growl Extra (она входит в стандартный дистрибутив Growl). Использовать ее очень просто:
echo "Hello, world" | growlnotify

Все полезные опции можно получить с помощью growlnotify --help. В данной заметке мы будем использовать опцию --icon (использование иконки приложения на основе файлового расширения его документов), и --message. Можно использовать и свою собственную иконку (см. --iconpath), а также сделать так, чтобы сообщение автоматически не исчезало (см. --wait).

Пишем скрипт

В AppleScript Editor пишем и отлаживаем скрипт (в моем случае я его сохранил в ~/Documents/edu/latin/ под именем latin.scpt, исходники берем здесь):
set filePath to "/Users/nuald/Documents/edu/latin/latin.txt"
set growlNotify to "/usr/local/bin/growlnotify"
set fp to open for access POSIX file filePath
set result to paragraphs of (read fp as «class utf8»)
set output to item (random number from 1 to length of resultof result
close access fp
do shell script growlNotify & " --icon scpt --message '" & output & "'"

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

В данном примере используется файл latin.txt в кодировке UTF-8. Если вы хотите использовать другую кодировку, см. команду read в AppleScript Language Guide. Сам файл представляет из себя просто набор строчек вида:


Раuса verba — поменьше слов
Paupertas nоn est vitium — бедность — не порок
Pax vobiscum! — мир вам!
Per aspera ad astra — через тернии к звездам!


Скрипт читает файл в массив, выбирает случайный элемент и скармливает growlnotify.

Естественно, использование AppleScript сугубо опционально, и можно запускать программу написанную на любом языке программирования. Но у AppleScript есть преимущество — удобная интеграция с системой (см. «словарь» приложений File->Open Dictionary). Для ознакомления также советую почитать примеры скриптов в /Library/Scripts/.

Настраиваем Launchd

Launchd — это демон для запуска процессов, и он позиционируется Apple как замена cron, xinetd, mach_init, и init. Естественно, можно использовать и cron, но в launchd есть интересные опции и возможности, которые будут весьма любопытны всем интересующимся. Детали смотрите в мануале: man launchd.plist.

Для запуска скрипта по расписанию пишем конфигурационный файл (plist) и сохраняем его в ~/Library/LaunchAgents (в моем случае файл называется edu.latin.plist).

Открываем Property List Editor и составляем следующее (хотя лучше использовать данный редактор уже для редактирования, а не для написания с нуля, благо plist — это обычный XML-файл):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>edu.latin</string>
        <key>ProgramArguments</key>
        <array>
                <string>osascript</string>
                <string>/Users/nuald/Documents/edu/latin/latin.scpt</string>
        </array>
        <key>StartInterval</key>
        <integer>900</integer>
</dict>
</plist>

Параметр Label обязателен и должен быть уникален для системы. Запуск скрипта делаем через osascript. Интервал настраиваем параметром StartInterval и указываем в секундах.

Данная конфигурация сработает при следующем логине, однако можно запустить и сразу:
launchctl load edu.latin.plist 

launchctl имеет ряд других интересных команд для удобной работы с задачами, в частности команду list:
launchctl list | grep edu.latin
-    0    edu.latin

Если во второй колонке указан 0, значит все нормально (это показывается код выхода). Если нет, смотрите лог /var/log/system.log.

Postscriptum

Данная функциональность не уникальна для MacOSX — в Linux-е, например, можно продублировать тоже самое с помощью cron и notify-send (из пакета libnotify-bin). Windows имеет Growl for Windows и «Планировщик задач». Однако в целом, в MacOSX некоторые вещи делать удобно и просто (советую ознакомиться с разными параметрами для launchd.plist, в частности, WatchPaths и StartOnMount), и я надеюсь данная заметка позволит вам повысить эффективность вашей работы, и понять как оптимизировать некоторые насущные для вас задачи.
Tags:
Hubs:
+22
Comments 17
Comments Comments 17

Articles