Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

А теперь неспеша всё отрефакторим

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

Способ я придумал, реализовал и выложил на «Гитхаб». Но мозгу задача понравилось, не могу остановиться и перестать думать о том как всё переделать. Уже начал накидывать новый прототип. Выкладывать целиком пока не буду, там не готово, но кое-какие куски покажу в нескольких постах — там много интересных проблем.

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

Так как я делаю всё под «Мак», программировать решил на «ЭплСкрипте» — так проще всего.

on is_running(appName)
    tell application "System Events" to (name of processes) contains appName
end is_running

set browsers to {"Safari", "Chrome", "Opera", "Firefox", "Edge", "Yandex"}

repeat with browser in browsers
    if is_running(browser) then
        tell application browser
            if exists window "ZX Spectrum online emulator" then
                log browser
                activate
                exit repeat
            end if
        end tell
    end if
end repeat

Что тут происходит? Я перебираю все известные мне браузеры по имени, ищу какие из них запущены, в них смотрю — называется ли активное окно «ZX Spectrum online emulator», если да, остаюсь в нём, сообщая наружу какой из браузеров найден.

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

Так как основная оболочка у меня на «Баше», осталось как-то из «ЭплСкрипта» забрать имя найденного браузера. Я делаю это так:

BROWSER=$(osascript <<BROWSERS 2>&1
# … тут программа на «ЭплСкрипте»
BROWSERS
)

В итоге, в переменной $BROWSER будет лежать имя браузера или пусто, если подходящий не найден.

Перенаправление потока 2>&1 необходимо, так как команда log «ЭплСкрипта» выведет имя браузера в поток для ошибок, а конструкция $( … ) ждёт его в стандартном выводе.