Уход от AppleScript через Ruby: rb-appscript или rubyosa?

Короткий ответ: Избегайте чего-либо до и включая 1 023, или более чем 49 152, и протестируйте выбранный порт против сервисов на Вашу сеть.

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

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

16
задан kch 21 August 2009 в 21:10
поделиться

4 ответа

Quoth kch:

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

SB опускает некоторые функции, найденные в AppleScript. Например, следующий скрипт перемещает все файлы с рабочего стола в папку Documents:

tell application "Finder"
   move every file of desktop to folder "Documents" of home
end tell

В SB класс SBElementArray сильно ограничивает вашу возможность применять одну команду к нескольким объектам, поэтому вам либо придется прибегать к низкоуровневому API или получить список отдельных ссылок на файлы и перемещать их по одной:

require 'osx/cocoa'; include OSX
require_framework 'ScriptingBridge'

finder = SBApplication.applicationWithBundleIdentifier('com.apple.finder')
destination = finder.home.folders.objectWithName('Documents')
finder.desktop.files.get.each do |f|
   f.moveTo_replacing_positionedAt_routingSuppressed(destination, nil, nil, nil)
end

В rb-appscript вы должны использовать тот же подход, что и AppleScript:

require 'appscript'; include Appscript

app("Finder").desktop.files.move(:to => app.home.folders["Documents"])

...

SB скрывает событие Apple механизм гораздо тяжелее, чем AppleScript. AppleScript может быть проблемой, чтобы понять, что из-за странного синтаксиса, склонности к конфликтам ключевых слов и тому подобного, но помимо этого он в основном представляет события Apple как есть. Единственная действительно значимая магия в AS - это «неявное получение». поведение, когда он оценивает буквальную ссылку, которая не появляется в качестве параметра команды. Самый большой грех AppleScript заключается в том, что его документация лучше не объясняет, как он на самом деле работает, но есть очень хорошая статья Уильяма Кука , которая проливает свет на то, что на самом деле происходит.

SB, с другой стороны, изо всех сил пытается притвориться, что это настоящий Cocoa API с поведением в стиле какао, поэтому накладывает большое количество магии. Результатом является что-то внешне привлекательное для разработчиков Какао, но как только эти абстракции начинают просачиваться - а абстракции неизменно случаются - вы совершенно не понимаете, что происходит. Например, SBElementArray утверждает, что является массивом - он даже является подклассом NSMutableArray - но когда вы действительно пытаетесь использовать его методы массива, половина из них работает, а половина - нет. Фактически, это вообще не настоящий массив; это оболочка вокруг неоцененного спецификатора объекта события Apple, сфальсифицированного, чтобы притвориться NSMutableArray. Поэтому, когда он делает что-то не-похожее на массив, вы в значительной степени стараетесь понять, почему. И, как упоминалось в №1, некоторые из этих толстых абстракций затрудняют доступ к стандартным функциям событий Apple внизу.

SB в первую очередь пытается быть хорошим Cocoa API, а не хорошим API событий Apple, и в итоге оказывается не очень хорош в этом.

Appscript, кстати, следует примеру AppleScript и использует противоположный подход: делать события Apple правильными , а затем позаботьтесь об адаптации основного языка. Вот почему некоторые люди предпочитают RubyOSA, а не rb-appscript; в то время как appscript - более эффективное решение, если вы Если исходить из сильно объектно-ориентированного фона, это будет очень странно. Это связано с тем, что события Apple используют парадигму, основанную на RPC-плюс-запросах, и любое сходство сценария приложения с ООП является чисто синтаксическим. Ближайшей аналогией была бы отправка XQueries через XML-RPC, и к этому нужно привыкнуть.

...

SB имеет тенденцию испытывать значительно больше проблем совместимости приложений, чем AppleScript.

Некоторые из этих проблем связаны с тем, что SB навязывает свои собственные идеи о том, как Apple event IPC должен работать поверх того, как он на самом деле работает. Например, SB создает набор [псевдо] прокси-классов, представляющих классы, определенные в словаре; затем он налагает различные ограничения на то, как вы можете взаимодействовать с этими объектами, в основном на основе классических объектно-ориентированных правил поведения.

Например, следующий сценарий получает имена всех подпапок папки Documents:

tell application "Finder"
   get name of every folder of entire contents of folder "Documents" of home
end tell

Если вы попробуете тот же подход в SB:

finder.home.folders.objectWithName('Documents').entireContents.folders.arrayByApplyingSelector(:name)

, он дойдет до метода #folders, а затем выдает ошибку, потому что тип Свойство «все содержимое» в словаре Finder объявлено как «ссылка». Поскольку в словаре нет «эталонного» класса с элементами «папка», SB не позволяет вам создавать этот конкретный запрос (если вы не хотите перейти к низкоуровневым API и использовать необработанные коды AE). Это совершенно законно в соответствии с правилами событий Apple, но не вписывается в более узкий набор правил, ориентированных на объектно-ориентированный подход, наложенный SB.

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

tell application "iTunes"
   make new playlist with properties {name:"test 1"}
end tell

SB не делает ' t позволяет вам использовать любые ярлыки, предоставляемые iTunes (вы можете опустить ссылку на исходный объект, в котором вы хотите создать список воспроизведения, и в этом случае используется основной источник `` Библиотеки ''), поэтому давайте напишем это полностью для лучшее сравнение:

tell application "iTunes"
   make new playlist at source "Library" with properties {name:"test"}
end tell

В SB вы бы написали это как:

itunes = SBApplication.applicationWithBundleIdentifier('com.apple.itunes')

playlists = itunes.sources.objectAtIndex(0).playlists()
newplaylist = itunes.classForScriptingClass(:playlist).alloc().initWithProperties({:name => 'test'})
playlists.addObject(newplaylist)

Однако, когда вы запускаете его, он блокирует #addObject. В своей попытке превратить одиночную команду make в многострочное упражнение, SB предполагает, что параметр at всегда будет ссылкой формы конец of , как показано в сценариях Cocoa Scripting -основанные приложения делают это. У приложений Carbon нет единой стандартной структуры для реализации поддержки событий Apple, поэтому они, как правило, немного различаются по своим требованиям. iTunes, например, ожидает ссылку на объект-контейнер, в данном случае «исходная« Библиотека »», и не любит, когда SB передает «конец плейлистов исходной« Библиотеки »». Таковы многие приложения AppleScriptable, но SB игнорирует эту реальность в своем определении быть «объектно-ориентированным».

Еще больше проблем возникает, когда словарь приложения не является на 100% точным или исчерпывающим в деталях. Ни форматы aete, ни sdef не позволяют описать, как работает интерфейс сценариев приложения со 100% подробностями; о некоторых вещах пользователи должны только догадываться или описывать в дополнительной документации - одним из примеров является природа свойства Finder «все содержимое». Другая информация, например, какие классы объектов могут быть элементами каких других классов объектов и каков тип каждого свойства, фактически никогда не используется самим AppleScript - он существует исключительно как пользовательская документация. Поскольку AppleScript не полагается на эту информацию, любые ошибки будут пропущены при тестировании поддержки сценариев приложения против AppleScript, поскольку сценарии работают нормально, несмотря на это. SB действительно использует эту информацию, поэтому любые опечатки приведут к отсутствию или неисправности функций, которые придется обходить, снова переходя к низкоуровневым API.

Appscript, BTW, не на 100% «AppleScript-совместимый» либо, но это действительно намного ближе. Ранние версии appscript также пытались наложить различные правила объектно-ориентированного программирования на события Apple, такие как принудительное применение объектной модели, определенной по словарю, но после года столкновений с несовместимостью приложений я гангнул все это «умное» code и потратил следующие несколько лет на попытки перепроектировать внутренние махинации AppleScript с помощью черного ящика и заставить appscript имитировать их как можно точнее. Другими словами, «если вы не можете победить их (а вы не можете), присоединяйтесь к ним». И там, где appscript действительно сталкивается с проблемой совместимости, обычно есть способы обойти это, в том числе переключение внутренних параметров совместимости, экспорт терминологии приложения в модуль, исправление его вручную и использование вместо этого или переход к низкоуровневому необработанному коду AE. API.

...

FWIW, я также должен добавить несколько связанных с этим полезных свойств приложений.

Во-первых, инструменты ASDictionary и ASTranslate на сайте appscript - ваши друзья. ASDictionary будет экспортировать словари приложений в формате HTML в стиле appscript, а также включает встроенный метод #help в rb-appscript; отлично подходит для интерактивной разработки в irb. ASTranslate примет команду AppleScript и (при наличии ошибок) вернет эквивалентную команду в синтаксисе appscript.

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

В-третьих, Мэтт Нойбург написал книгу о rb-appscript . Прочтите это, если вы думаете об использовании rb-appscript. И прочтите статью доктора Кука, независимо от того, что вы в конечном итоге решите.

...

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

ps Нед, твой блестящий доллар в почте. ;)

ASTranslate примет команду AppleScript и (при наличии ошибок) вернет эквивалентную команду в синтаксисе appscript.

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

В-третьих, Мэтт Нойбург написал книгу о rb-appscript . Прочтите это, если вы думаете об использовании rb-appscript. И прочти статью доктора Кука, независимо от того, что ты в конце концов выберешь.

...

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

ps Нед, твой блестящий доллар в почте. ;)

ASTranslate примет команду AppleScript и (при наличии ошибок) вернет эквивалентную команду в синтаксисе appscript.

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

В-третьих, Мэтт Нойбург написал книгу о rb-appscript . Прочтите это, если вы думаете об использовании rb-appscript. И прочти статью доктора Кука, независимо от того, что ты в конце концов выберешь.

...

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

ps Нед, твой блестящий доллар в почте. ;)

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

В-третьих, Мэтт Нойбург написал книгу о rb-appscript . Прочтите это, если вы думаете об использовании rb-appscript. И прочти статью доктора Кука, независимо от того, что ты в конце концов выберешь.

...

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

ps Нед, твой блестящий доллар в почте. ;)

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

В-третьих, Мэтт Нойбург написал книгу о rb-appscript . Прочтите это, если вы думаете об использовании rb-appscript. И прочти статью доктора Кука, независимо от того, что ты в конце концов выберешь.

...

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

ps Нед, твой блестящий доллар в почте. ;)

Мэтт Нойбург написал книгу о rb-appscript . Прочтите это, если вы думаете об использовании rb-appscript. И прочтите статью доктора Кука, независимо от того, что вы в конечном итоге решите.

...

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

ps Нед, твой блестящий доллар в почте. ;)

Мэтт Нойбург написал книгу о rb-appscript . Прочтите это, если вы думаете об использовании rb-appscript. И прочти статью доктора Кука, независимо от того, что ты в конце концов выберешь.

...

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

ps Нед, твой блестящий доллар в почте. ;)

46
ответ дан 30 November 2019 в 15:26
поделиться

Я не пробовал RubyOSA, но добился большого успеха с rb-appscript . У меня он отлично сработал и намного приятнее, чем работать с AppleScript напрямую.

Вы видели этот поток, в котором сравниваются два ? Там есть хороший подробный ответ, в котором отмечены различия.

5
ответ дан 30 November 2019 в 15:26
поделиться

Apple включает поддержку сценариев для Какао-совместимых языков через структуру, называемую «Мост сценариев». Я использую это через RubyCocoa / MacRuby для своих сценариев. Он включен прямо в коробку, так что это довольно удобно.

require 'osx/cocoa'
require_framework 'ScriptingBridge'
iTunes = SBApplication.applicationWithBundleIdentifier 'com.apple.iTunes'
puts iTunes.selection.name

Единственное серьезное раздражение, которое я обнаружил в Scripting Bridge, заключается в том, что вам нужно использовать такие идентификаторы пакетов, а не имена, но это не совсем так. проблема для меня в любом случае. Он также включен только в 10.5, поэтому, если вам нужна поддержка Panther или Tiger, вам понадобится один из других.

Из двух других rb-appscript все еще активно разрабатывается, в то время как RubyOSA была заморожена пару лет. назад, так что я, вероятно, выбрал бы первое. Поскольку Ruby 2, MacRuby и другие новые реализации вносят изменения в язык, rb-appscript, скорее всего, будет работать в будущем. В остальном они очень похожи. По сути, я отношусь к rb-appscript как к новой версии RubyOSA, хотя технически это не так.

3
ответ дан 30 November 2019 в 15:26
поделиться

Краткий ответ: rb-appscript.

Потому что Scripting Bridge кажется беспорядочным и RubyOSA больше не поддерживается.

2
ответ дан 30 November 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: