Apex framework что это
The NVIDIA APEX SDK is designed to address three important issues facing game physics:
- Significant programmer involvement is required.
- Game physics content typically gets designed to the game’s “min-spec” system.
- Game engine performance limitations.
The first problem arises because the traditional interface to middleware physics is an API. It’s designed for programmers. These APIs need to be “general purpose”, so they expose a very “low-level” interface: rigid bodies, shapes, joints, particles, impulses, and collisions. They are basically, a “toolbox” of all the primitive components of a physics simulation. This gives the game programmer a lot of control, but in return, it requires a lot of non-trivial work. This work requires broad physics programming experience, and is often not budgeted by game developers. This is similar, in many ways, to the specialized work of writing an efficient rendering engine on top of D3D. With graphics, artists don’t directly create vertex buffer objects in the editor, but for physics that’s what physics engine integration requires. Even when authoring tools (like plug-ins for Max/Maya) are made available to attempt to reduce the programmer involvement that’s required, it’s the same “low-level toolbox” that is exposed to the artists. If the artists want to create content at a higher level of abstraction - not using these primitive building blocks - then you’re back to requiring a lot of programmer involvement again.
The second problem arises because there are huge performance differences between the consoles, and between different generations of PC CPUs, and GPUs. So, if game developers want their game to take advantage of higher end hardware, when it’s available, to improve the quality, or scale of their game physics, custom authoring is required for each platform or hardware configuration. The result of this is that, in practice, only the “lowest common denominator” content gets created, and users don’t benefit from better hardware.
The third problem arises because many game engines make the assumption that the world is largely static: that there are many static objects, but few dynamic objects Therefore, they tend to use very “heavy weight” data structures for their moving objects: For example: Using an “Actor” class for each and every crate, barrel, or piece of debris flying around the level. So even though the physics system might be able to handle very complex simulations, the overhead of the game engine (the scene graph, the AI, the rendering) makes it impossible, in practice, to use more than a few dozen objects in the level.
Salesforce поставляет собственную онлайн IDE Developer Console
Developer Console позволяет новичку быстро начать программировать без погружения в мир кастомных IDE.
С Apex ничего подобного не было, поскольку любой инстанс Salesforce содержит в себе встроенную IDE, которая называется Developer Console. Устанавливать ничего не нужно, достаточно открыть в браузере Developer Console и сразу писать код. Код можно запустить сразу и проверить его работу в реальном (или «песочном») приложении.
Да, более опытные разработчики Salesforce предпочитают работать в Visual Studio Code или Eclipse, но для начинающих Developer Console – то, что нужно.
Developer Console выглядит так:
Apex имеет out-of-the-box доступ к базе данных
Большим плюсом для начинающего разработчика Apex считаю простоту обращения в базу данных из кода. В базу данных можно обратиться из любого места в коде, для этого не нужно дополнительных настроек и соединений.
Вот несколько примеров обращения к базе данных из кода:
The NVIDIA APEX Solution¶
APEX addresses each of the above problems as follows:
Significant programmer involvement is required to take a relatively abstract PhysX-SDK and create a lot of meaningful content.
APEX provides a high-level interface to artists and content developers. This reduces the need for programmer time, adds automatic physics behavior to familiar objects, and leverages multiple low-level PhysX-SDK features with a single easy-to-use authoring interface.
Game physics content typically gets designed to the game’s “min-spec” system.
APEX requires each functional module to provide one or more ways to “scale the content” when running on better-than-min-spec systems, and to do this without requiring a lot of extra work from the game developer (artist or programmer, but especially programmer).
Game engine performance limitations.
APEX avoids many of the game engine bottlenecks by allowing the designer to identify the physics that is important to the game logic, and what can be sent directly to the renderer, bypassing the fully generic path through the game engine. It also allows the game engine to treat an APEX asset as a single game object, even though it may actually comprise many hundreds or even thousands of low-level physics components.
The APEX SDK comprises a set of C++ header files that define the SDK public API, a set of binary libraries that implement the functionality, as well as documentation of the API and of the functionality provided. Source code to the libraries may be provided to certain developers, according to business considerations. The APEX SDK also includes a set of tools (binary executables and DCC plugins) for content creation.
The APEX architecture is a modular one. Modules implement intuitive, specific purpose, high-level physics technology at a level of abstraction that is appropriate for content creators (artists and level designers). Modules typically manage multiple physics primitive elements (e.g.: rigid bodies, shapes, joints, etc..), and may manage multiple simulation types (e.g.: rigid body, fluid, cloth, soft-body).
Минусы Apex:
Мало материалов на русском языке (почти нет)
Немногочисленное русскоязычное сообщество
Применимость только для продуктов на платформе Salesforce
Вводная информация
Предполагается, что читатель знаком с Oracle Database версии хотя бы с 11-й, SQL, PL/SQL и особенно с тем, что такое EXECUTE IMMEDIATE и как оно работает.
Я начну с обзора наиболее часто используемых разделов IDE. Я тоже покажу несколько скриншотов. Куда же без них, раз всё здесь сделано из визуальных компонентов. Но их будет не так много, как в плохих туториалах, и в основном они будут в начальных главах, а дальше я буду просто указывать название раздела IDE, в котором находятся необходимые вещи. Сразу обращу ваше внимание, что это просто первое знакомство с IDE. Более подробная информация о том, когда на какую кнопку нажимать и где что смотреть, будет дана дальше, когда я перейду к конкретным темам.
Мало материалов на русском языке (почти нет)
На русский язык не переведены такие официальные ресурсы, как:
Это затрудняет обучение ребятам, которые не знают английский язык.
Version Numbers¶
The APEX Framework and all APEX Modules are independently versioned using a 2-part version number, consisting of a major number and a minor number, in the format “major.minor”, for example: “1.3”.
Asset definitions within a module may change from version to version of the module, but new versions of the AssetAuthoring and Asset derived classes will support deserializing all old versions of the asset.
Version Numbers¶
The APEX Framework and all APEX Modules are independently versioned using a 2-part version number, consisting of a major number and a minor number, in the format “major.minor”, for example: “1.3”.
Asset definitions within a module may change from version to version of the module, but new versions of the AssetAuthoring and Asset derived classes will support deserializing all old versions of the asset.
Нельзя сказать, что я до этого не был знаком с ООП или другими языками. Мое знакомство ограничивалось теоретическими знаниями, полупройденными курсами на Codecademy или лабораторными работами в институте. Естественным образом все тонкости технологии, синтаксис языка, его возможности и ограничения быстро выветривались из памяти, поскольку практического применения этим навыкам я не находил.
В 2019 году я пришёл в Accenture как специалист по поддержке и доработке CRM Salesforce. Диапазон задач сначала был очерчен недостаточно чётко, поэтому я стал изучать инструменты как администрирования, так и разработки на Salesforce.
Сейчас мой опыт разработки на Apex около года, я стал сертифицированным разработчиком Salesforce. Могу подвести первые итоги.
Будет полезно для:
новичков в программировании
администраторов Salesforce, которые хотят освоить разработку
опытных разработчиков, которые хотят узнать о разработке на платформе Salesforce
Ниже я кратко приведу все плюсы и минусы Apex, с точки зрения выбора его как языка для обучения. Затем подробнее рассмотрю каждый пункт.
Плюсы Apex:
Apex приучает к написанию оптимального, ресурсоэффективного кода
Apex приучает к юнит-тестированию и к test-driven разработке
Apex имеет единую и обновляемую документацию, собранную на портале Salesforce
Apex имеет out-of-the-box доступ к БД (не нужно писать коннекторов)
Apex – это на 90% Java. Вы с легкостью сможете понимать Java-код после разработки на Apex
Salesforce поставляет собственную онлайн IDE Developer Console, которая позволяет новичку быстро начать программировать без погружения в мир кастомных IDE
Apex можно осваивать в Trailhead-песочницах, без установки и настройки дополнительного софта.
Trailhead обучает программированию на Apex с полного нуля. Trailhead-модули обучают вас концепциям ООП и синтаксису Apex на языке простых смертных (к сожалению, только на английском)
Definitions¶
Scalable Content In the context of APEX, content is said to be scalable whenever it can adapt to running on a variety of systems with various degrees of physics simulation capability (e.g.: CPU, CPU+PPU, CPU+GPU, PS3, Xbox360), and demonstrate benefit from running on systems with increased physics simulation capability. APEX Asset An APEX asset is a data structure that is created at game authoring time, can be serialized to non-volatile storage, loaded by the APEX run-time, and used to create instances (called actors) in the scene. APEX Authorable Object An authorable object is a definition of an asset data structure, the specification of how it will be authored, the specification of the runtime functionality, and the software that implements all this. This software includes, at a minimum, an Asset Authoring class, an Asset class, and an Actor (or instance) class. APEX Module An APEX module is software component, consisting of a group of related APEX Authorable Objects. It includes a run-time component and an authoring component. The run-time component for each APEX Module is shipped as a separate library or DLL. The authoring component may be provided by multiple tools, and/or may be combined in a single tool with other authoring functionality. APEX Framework The APEX Framework comprises all parts of APEX that are not Modules. The Framework may contain Authorable Objects. APEX Feature An APEX Feature is a group of inter-related APEX Authorable Objects that provide functionality to the game developer to facilitate the creation of a particular type of scalable content. An APEX Feature may span multiple Modules, and may include subsets of Modules. Scalability The degree to which an APEX Feature enables content created for it to adapt to running on a variety of systems with various degrees of physics simulation capability, and to demonstrate benefit from running on systems with increased physics simulation capability. Scalable Parameter A member of an APEX asset that is authored as a range of values, rather than as a unique value, in order to provide scalability. At run-time, a value in the authored range is selected based on the capabilities of the system.
Настройка веб-сервера
Для того, чтобы весь трафик шифровался, я решил использовать Nginx.
Его установка предельно проста:
Затем необходимо скопировать на сервер SSL-сертификаты и внести изменения в конфигурационный файл веб-сервера, либо создать новый с расширением .conf в папке /etc/nginx/conf.d/. Туда необходимо добавить следующие строки, изменив пути к сертификатам и указав соответствующее доменное имя:
содержимое файла /etc/nginx/reverse_proxy.conf:
На этом установка Oracle Application Express закончена. В следующей статье мы установим тестовое веб-приложение, а затем сделаем что-нибудь по-настоящему полезное.
Update. В связи с пожеланиями, в статью добавлено описание фронтенда, который обеспечивает TLS-шифрование.
The NVIDIA APEX SDK is designed to address three important issues facing game physics:
- Significant programmer involvement is required.
- Game physics content typically gets designed to the game’s “min-spec” system.
- Game engine performance limitations.
The first problem arises because the traditional interface to middleware physics is an API. It’s designed for programmers. These APIs need to be “general purpose”, so they expose a very “low-level” interface: rigid bodies, shapes, joints, particles, impulses, and collisions. They are basically, a “toolbox” of all the primitive components of a physics simulation. This gives the game programmer a lot of control, but in return, it requires a lot of non-trivial work. This work requires broad physics programming experience, and is often not budgeted by game developers. This is similar, in many ways, to the specialized work of writing an efficient rendering engine on top of D3D. With graphics, artists don’t directly create vertex buffer objects in the editor, but for physics that’s what physics engine integration requires. Even when authoring tools (like plug-ins for Max/Maya) are made available to attempt to reduce the programmer involvement that’s required, it’s the same “low-level toolbox” that is exposed to the artists. If the artists want to create content at a higher level of abstraction - not using these primitive building blocks - then you’re back to requiring a lot of programmer involvement again.
The second problem arises because there are huge performance differences between the consoles, and between different generations of PC CPUs, and GPUs. So, if game developers want their game to take advantage of higher end hardware, when it’s available, to improve the quality, or scale of their game physics, custom authoring is required for each platform or hardware configuration. The result of this is that, in practice, only the “lowest common denominator” content gets created, and users don’t benefit from better hardware.
The third problem arises because many game engines make the assumption that the world is largely static: that there are many static objects, but few dynamic objects Therefore, they tend to use very “heavy weight” data structures for their moving objects: For example: Using an “Actor” class for each and every crate, barrel, or piece of debris flying around the level. So even though the physics system might be able to handle very complex simulations, the overhead of the game engine (the scene graph, the AI, the rendering) makes it impossible, in practice, to use more than a few dozen objects in the level.
Обзор IDE
Стартовый экран, который вы увидите сразу после входа в IDE:
Главные элементы здесь — это 4 большие кликабельные картинки:
- "App Builder": это, собственно, то место, где можно создавать приложения и где вы будете проводить до 99% времени.
- "SQL Workshop": заменитель обычной IDE для работы с СУБД Oracle. Там вы можете посмотреть объекты БД (таблицы, индексы, пакеты, и т. п.) и выполнять SQL-запросы. Если у вас есть возможность делать все это через "обычные" IDE (вроде Oracle SQL Developer или PL/SQL Developer) — делайте через них. Тем не менее, этот раздел тоже может быть полезен и о нем я тоже расскажу.
- "Team Development": инструменты для командной разработки. Честно говоря, я ни разу не видел, чтобы хоть кто-то ими пользовался на практике (включая меня). Любопытства ради я туда тоже заглядывал и совсем бесполезным этот раздел я бы не назвал, хотя и очень хочется.
- "App Gallery": раздел с демо-приложениями. К тому моменту, когда он появился, я уже неплохо знал апекс и почти не заглядывал туда, но начинающим, думаю, это будет полезно. Там много разных простеньких приложений, на их примере можно изучать, как использовать те или иные возможности.
В меню в самом верху страницы продублированы эти же 4 пункта.
Кроме этого, есть еще несколько малополезных вещей: ниже есть некоторое количество статистической информации (типа наиболее часто редактируемых приложений или наиболее активных разработчиков). И есть колонка справа, где также немного статистики и дополнительных ссылок.
Рассмотрим App Builder и SQL Workshop подробнее.
App builder
Эта страница выглядит примерно вот так:
Основные элементы этой страницы: четыре большие кнопки как на предыдущей странице, список уже имеющихся приложений, правая колонка со списком последних измененных приложений и дополнительными действиями. Четыре кнопки — это:
- "Create": создать новое приложение. Эта же функция продублирована чуть ниже (синяя кнопка "Create" над отчетом со списком приложений). Кнопка запускает мастер создания приложений.
- "Import": импортировать приложение. Апекс позволяет переносить приложения с одного сервера на другой в виде текстовых файлов (которые, по сути, являются длииииными PL/SQL скриптами с вызовами функций создания всех элементов приложения).
- "Dashboard": малополезное сборище статистики разработки приложений. Кто, когда, где, сколько изменений сделал. Думаю, даже вашему начальнику будет неинтересно туда смотреть.
- "Workspace Utilities": набор дополнительных инструментов для управления приложением. Честно говоря, туда я тоже почти не заглядываю.
Так же хочу обратить ваше внимание на вот такую маленькую кнопочку в панели отчета:
Она переключает вид отчета с такого, как на скриншоте выше (с "картинками" приложений) на отчет в виде таблицы:
Похожие отчеты встречаются и в других разделах IDE. Я предпочитаю табличный вид, поэтому далее все скриншоты будут с ним.
После того, как вы создадите приложение или откроете существующее, вы увидите следующую страницу (очень похожую на предыдущую по структуре):
На эту страницу вы будете заходить очень часто, и полезных функций здесь тоже очень много. Большие кнопки с картинками:
- "Run Application": эта кнопка запускает ваше приложение. Оно откроется в отдельном окне. По умолчанию — именно в окне, а не во вкладке браузера, но это поведение настраивается (об этом позже).
- "Supporting Objects": этот раздел служит для решения вопросов, связанных с установкой, обновлением и удалением приложений. Обычно им почти не пользуются.
- "Shared Components": я бы сказал, это первый или второй по важности раздел IDE (еще один — редактор страниц). Если вы будете много разрабатывать на апексе, то очень скоро заметите, что выучили структуру этого раздела как "Отче наш".
- "Utilities": еще один набор (мало)полезных вспомогательных функций.
- "Export / Import": позволяет экспортировать или импортировать приложения или отдельные части приложения.
И две дополнительные кнопки, которые обведены оранжевой рамкой на скриншоте:
- Кнопка "Edit application properties". Нажав на нее, вы попадете на страницу настроек свойств приложения. Возможно, вы не будете заходить в этот раздел часто, но он очень важен, потому что там хранятся настройки приложения, от которых много чего зависит. Далее, если я буду упоминать где-то "свойства приложения" — ищите их в этом разделе.
- В кои-то веки полезная функция в правой панели: "Delete this Application". В то время как многие функции в апексе продублированы в разных местах, эта функция есть только здесь, и с непривычки первый раз ее найти сложно.
Application properties
Здесь прежде всего интересна организация доступа к большому количеству настроек.
Настройки сгруппированы в 4 группы (см. верхнюю рамку), а в каждой группе есть еще по нескольку подгрупп (см. нижнюю рамку), у каждой группы есть свое название. Похожим образом настройки организованы в очень многих местах в апексе. В дальнейшем я буду просто указывать путь к нужной настройке примерно так: "Application Properties" → "Definition" → "Name" → "Version".
Также, если вы посмотрите на хлебные крошки вверху страницы, вы увидите, что там написано "Edit Application Definition", хотя заходили вы, казалось бы, в "Application Properties". Просто не обращайте внимания.
Shared Components
Shared Components — это наше всё. Этот раздел является промежуточным пунктом на пути к конкретным компонентам приложений. Покажу здесь общий вид, просто чтобы вы представляли, где что находится:
Совсем неважной ерунды здесь почти нет. Каждый раздел вам так или иначе может понадобиться. Названия разделов говорят сами за себя, добавить почти нечего:
- "Application Logic": средства управления логикой приложения.
- "Security": вопросы безопасности и управления доступом к приложению целиком и к отдельным компонентам в зависимости от ролей пользователей.
- "Other Components": это "все остальные компоненты". По-хорошему, этому разделу следовало бы быть последним, но он почему-то здесь. А подпункт "List of Values" я бы вообще в Application Logic перенес.
- "Navigation": компоненты приложения для обеспечения навигации.
- "User Interface": настройка внешнего вида приложения, стилей и т. п.
- "Files": раздел для файлов (например, css или js). Незаменим, если у вас нет доступа к ОС, и все равно удобен, даже если доступ есть.
- "Data Sources": работа с источниками данных (для загрузки и выгрузки).
- "Reports": отчеты, очевидно.
- "Globalization": раздел для перевода приложений на другие языки.
Перевод приложений в апексе сделан просто ужасно (честно, я пытался придумать, как сделать его хуже — и не смог), и нет никаких свидетельств того, что в будущем станет лучше.
Ужасно с точки зрения архитектуры и удобства работы над переводом. Могу только сказать разработчикам: "Спасибо, что хотя бы без багов" (но тут как посмотреть: переводы устроены так, что некоторые особенности их работы мало чем отличаются от багов).
Приходится с этим жить.
Page Designer
Page Designer — редактор страниц. Это, наверное, главное место в IDE. Здесь вы будете создавать то, с чем напрямую взаимодействует пользователь, — страницы приложения. Здесь просто куча функций, почти как в кабине самолета. Чтобы попасть в Page Designer, нужно кликнуть по ссылке с названием страницы на странице приложения (извините за тавтологию). На скриншоте разноцветными рамками выделены основные составляющие редактора:
Панель кнопок вверху (в красной рамке):
- Поле для ввода номера страницы, стрелки вверх и вниз и кнопка "Go": навигация по страницам приложения. Каждая страница имеет номер, тут вы можете либо ввести номер нужной страницы, либо стрелками перейти к следующей/предыдущей, либо нажать на самую левую кнопку и в появившемся модальном окне выбрать страницу из списка.
- Кнопка с замком: позволяет заблокировать страницу от изменений другими разработчиками.
- Кнопки Undo/Redo
- Две кнопки с доступом к вспомогательным функциям.
- Кнопка-ссылка на Shared Components. Полезная, потому что туда-сюда ходить приходится постоянно. (Я сам, правда, предпочитаю просто держать Shared Components в отдельной вкладке — так еще быстрее).
- Кнопка "Save": сохраняет изменения на странице.
- Кнопка "Run": "запускает" страницу, то есть вы ее видите так, как ее потом увидит пользователь.
Слева (в оранжевой рамке) — панель с компонентами страницы. В этой панели есть 4 закладки:
- "Rendering": показывает, из каких составных частей состоит страница, какие процессы выполняются при рендеринге;
- "Dynamic Actions": действия, выполняемые на клиенте (например, обработчики событий javascript);
- "Processing": серверные процессы, связанные со страницей;
- "Page Shared Components": для прямого перехода к используемым на странице общим компонентам (те самые Shared Components).
По центру (в зеленой рамке) — панель, содержащая много разнородной информации. В верхней части панели есть 5 закладок, на которых можно найти:
Также центральная панель имеет снизу еще одну дополнительную панель, которую можно использовать для быстрого добавления компонентов на страницу.
Справа (в синей рамке) — панель свойств. Тут все просто — она показывает свойства выбранного в данный момент компонента. Часть свойств компонентов — простые: текст, число, значение из списка. Но у более сложных свойств компонентов есть дополнительные интерфейсные возможности, сильно облегчающие жизнь при работе с ними.
Свойство, представляющее собой большой текст. Например, код на PL/SQL или JavaScript. Выглядит так:
Можно писать код прямо так, в этом поле, а можно щелкнуть по кнопке вверху страва, и тогда откроется модальное окно с редактором кода, где доступны подсветка синтаксиса (для SQL, JavaScript, CSS, HTML), поиск в тексте и другие функции редактора.
Свойство — Shared Component. Если свойство является одним из компонентов приложения (Shared Component), то выбирать конкретный компонент можно из списка, а нажав на кнопку справа от списка
можно переместиться в раздел Shared Components непосредственно в свойства выбранного компонента (чтобы, например, их изменить).
Если у вас значение свойства выбирается из списка, иногда справа можно увидеть другую дополнительную кнопку:
Она называется "Quick pick" и используется, когда вариантов очень много. "Quick pick" дает чуть более быстрый доступ к небольшому подмножеству вариантов — как правило, там находятся наиболее часто используемые варианты. "Часто используемые варианты" здесь — не вами используемые, а "вообще". Это жестко заданный список и со временем не меняется.
SQL Workshop
Как я уже говорил, SQL Workshop — это заменитель обычной IDE (если у вас по каким-то причинам нет возможности ее использовать).
Он состоит из 5 разделов:
- "Object Browser": браузер объектов БД (таблиц, пакетов, функций и процедур, индексов, сиквенсов и прочего);
- "SQL Commands": раздел, где можно выполнить любой SQL запрос или PL/SQL код;
- "SQL Scripts": здесь можно загрузить текстовый файл со скриптом и выполнить его;
- "Utilities": разные дополнительные возможности, связанные с БД: например, есть графический построитель запросов (но не только);
- "RESTful Services": создание REST сервисов. Апекс тоже имеет REST (причем давно, еще в версии 4.2 они уже были)!
Object Browser
Здесь есть все, что нужно для работы с объектами БД: создание, изменение, удаление, просмотр свойств объектов, ввод данных в таблицы — для всего этого в этом разделе есть графический интерфейс. Вверху слева в выпадающем списке можно выбрать тип объектов (на скриншоте показаны таблицы), вверху справа можно выбрать схему, объекты которой вы можете посмотреть. В списке доступных схем вы не увидите все схемы сразу — это нормально. Как сделать схемы видимыми в апексе, я расскажу, когда дойду до администрирования.
Также я не вижу большого смысла описывать этот раздел подробнее: если вы знаете, что значит фраза "добавить столбец в таблицу", вы без труда догадаетесь, когда вам нужно будет нажимать на кнопку "Add Column" и что вас может ждать дальше.
SQL Commands
В этом разделе можно выполнять SQL запросы и PL/SQL код.
По возможностям этот раздел почти не уступает полноценным средам разработки. Не хватает разве что автодополнения кода и подсветки синтаксиса (а в Object Browser подсветка синтаксиса есть, кстати). Имеющиеся возможности:
- выполнение SQL, в том числе с параметрами (для ввода значений параметров появится отдельное окно);
- выполнение PL/SQL с возможностью вывода текста через dbms_output (вывод появится в окне ниже);
- выполнение только выделенной части кода (выделить текст мышкой, затем "Run");
- просмотр плана запроса;
- сохранение запросов.
Это, как вы понимаете, далеко не всё, что есть в IDE APEX, но на данном этапе не имеет смысла углубляться дальше. Отдельные элементы интерфейса апекса будут разобраны более подробно в темах, которые имеют к ним непосредственное отношение.
P. S. Я пока не могу сказать, что четко продумал структуру этого туториала, возможно, в будущем я добавлю еще скриншоты и описания в эту статью или опишу дополнительные возможности в других статьях. Осталось придумать, как оповещать заинтересованных о значительных правках старых статей.
Здравствуйте, друзья и коллеги. Однажды в компании возникла необходимость в создании веб-интерфейса для небольшой базы данных. Уже тогда было понимание того, что в будущем понадобится интеграция с LDAP, возможность гибко управлять правами доступа пользователей на просмотр определенных страниц, удобный конструктор для создания страниц, инструменты бизнес-аналитики. Тогда-то я и познакомился с Oracle Application Express (ApEx). Это мощнейшее средство входит в состав таких продуктов, как Oracle Database 11g, 12c, которые, в зависимости от используемой редакции, могут стоить немало. Как это часто бывает, желания превышали возможности.
Для таких случаев у Oracle есть бесплатная версия СУБД Oracle Database Express Edition (коротко XE). На нее накладываются следующие ограничения:
Нас эти ограничения вполне устраивали. Для сервера мы взяли VPS в Digital Ocean с 2Gb RAM, установили Centos 7.2. В следующей главе будет описана установка Oracle XE, а затем — обновление встроенного Application Express v.4 до последней актуальной версии (на момент написания статьи — 5.0.4).
Установка Oracle 11g XE
Установим необходимые пакеты, добавим swap в виде файла и внесём изменения в /etc/fstab:
Следующий шаг — опциональный. Можно сконвертировать Centos в Oracle Linux, затем скачать пакет, меняющий настроки ядра в соответствии с рекомендациями Oracle, подробности можно прочитать тут.
Для загрузки дистрибутива Oracle XE (доступны версии под Windows и Linux) понадобится регистрация на сайте вендора, она бесплатна и ни к чему не обязывает. Скачаем zip-архив, распакуем его и установим:
The NVIDIA APEX Solution¶
APEX addresses each of the above problems as follows:
Significant programmer involvement is required to take a relatively abstract PhysX-SDK and create a lot of meaningful content.
APEX provides a high-level interface to artists and content developers. This reduces the need for programmer time, adds automatic physics behavior to familiar objects, and leverages multiple low-level PhysX-SDK features with a single easy-to-use authoring interface.
Game physics content typically gets designed to the game’s “min-spec” system.
APEX requires each functional module to provide one or more ways to “scale the content” when running on better-than-min-spec systems, and to do this without requiring a lot of extra work from the game developer (artist or programmer, but especially programmer).
Game engine performance limitations.
APEX avoids many of the game engine bottlenecks by allowing the designer to identify the physics that is important to the game logic, and what can be sent directly to the renderer, bypassing the fully generic path through the game engine. It also allows the game engine to treat an APEX asset as a single game object, even though it may actually comprise many hundreds or even thousands of low-level physics components.
The APEX SDK comprises a set of C++ header files that define the SDK public API, a set of binary libraries that implement the functionality, as well as documentation of the API and of the functionality provided. Source code to the libraries may be provided to certain developers, according to business considerations. The APEX SDK also includes a set of tools (binary executables and DCC plugins) for content creation.
The APEX architecture is a modular one. Modules implement intuitive, specific purpose, high-level physics technology at a level of abstraction that is appropriate for content creators (artists and level designers). Modules typically manage multiple physics primitive elements (e.g.: rigid bodies, shapes, joints, etc..), and may manage multiple simulation types (e.g.: rigid body, fluid, cloth, soft-body).
Directory Structure¶
The APEX top level directory contains:
framework: | Everything that’s not a module |
---|---|
module: | APEX module specific code |
shared: | Example source code that may be useful to the developer |
externals: | SDKs used to build the samples applications |
bin: | Platform and SDK version specific DLLs, sample and tool executables |
lib: | Platform and SDK version specific libs |
docs: | Documentation |
samples: | Sample applications |
media: | APEX and rendering assets used for the samples |
NvParameterized: | |
NvParameterized API | |
public: | Foundation and PxTask headers |
At the lowest level of the directory hierarchy, the following naming conventions are used:
. /public: | This is the set of public (external) interface classes which hide underlying implementation. They can be used by any application, by tools, or internal APEX code. |
---|---|
. /include: | Non-public header files, including classes that implement public interface classes. |
. /src: | Source code. |
An APEX binary distribution consists of a set of DLL’s (Windows) and libraries (all platforms) as well as the header files of the Public API (APEX/framework/public and APEX/module/xx/public). It will also include tools (executables) and samples (source & executables).
Each APEX Module and the APEX Framework is in a separate library (and Windows DLL). An application can thus link (or load) only the APEX Modules that the application will be using in order to conserve code space. A further benefit of separate libraries is that it is easy for NVIDIA or third-party developers to create new APEX Modules that can be easily used in an existing APEX application.
Apex – это на 90% Java. Вы с легкостью сможете понимать Java-код после разработки на Apex
Salesforce создавала Apex на основе синтаксиса Java. Есть небольшие исключения, обусловленные спецификой Salesforce. Все отличия собраны на этой странице.
Но, если посмотреть на методы работы с примитивами и коллекциями, то они работают аналогично Java.
Сравните, к примеру, методы работы со String в Apex и String в Java.
Выходит, что обучаясь Apex вы во многом обучаетесь и Java. Это правило работает и наоборот.
Если вы решите перейти в Java-разработчики, вам не придется начинать с нуля. А полезные парадигмы мышления из Apex-разработки дадут вам хороший фундамент для написания ресурсоэффективного Java-кода.
Directory Structure¶
The APEX top level directory contains:
framework: | Everything that’s not a module |
---|---|
module: | APEX module specific code |
shared: | Example source code that may be useful to the developer |
externals: | SDKs used to build the samples applications |
bin: | Platform and SDK version specific DLLs, sample and tool executables |
lib: | Platform and SDK version specific libs |
docs: | Documentation |
samples: | Sample applications |
media: | APEX and rendering assets used for the samples |
NvParameterized: | |
NvParameterized API | |
public: | Foundation and PxTask headers |
At the lowest level of the directory hierarchy, the following naming conventions are used:
. /public: | This is the set of public (external) interface classes which hide underlying implementation. They can be used by any application, by tools, or internal APEX code. |
---|---|
. /include: | Non-public header files, including classes that implement public interface classes. |
. /src: | Source code. |
An APEX binary distribution consists of a set of DLL’s (Windows) and libraries (all platforms) as well as the header files of the Public API (APEX/framework/public and APEX/module/xx/public). It will also include tools (executables) and samples (source & executables).
Each APEX Module and the APEX Framework is in a separate library (and Windows DLL). An application can thus link (or load) only the APEX Modules that the application will be using in order to conserve code space. A further benefit of separate libraries is that it is easy for NVIDIA or third-party developers to create new APEX Modules that can be easily used in an existing APEX application.
Definitions¶
Scalable Content In the context of APEX, content is said to be scalable whenever it can adapt to running on a variety of systems with various degrees of physics simulation capability (e.g.: CPU, CPU+PPU, CPU+GPU, PS3, Xbox360), and demonstrate benefit from running on systems with increased physics simulation capability. APEX Asset An APEX asset is a data structure that is created at game authoring time, can be serialized to non-volatile storage, loaded by the APEX run-time, and used to create instances (called actors) in the scene. APEX Authorable Object An authorable object is a definition of an asset data structure, the specification of how it will be authored, the specification of the runtime functionality, and the software that implements all this. This software includes, at a minimum, an Asset Authoring class, an Asset class, and an Actor (or instance) class. APEX Module An APEX module is software component, consisting of a group of related APEX Authorable Objects. It includes a run-time component and an authoring component. The run-time component for each APEX Module is shipped as a separate library or DLL. The authoring component may be provided by multiple tools, and/or may be combined in a single tool with other authoring functionality. APEX Framework The APEX Framework comprises all parts of APEX that are not Modules. The Framework may contain Authorable Objects. APEX Feature An APEX Feature is a group of inter-related APEX Authorable Objects that provide functionality to the game developer to facilitate the creation of a particular type of scalable content. An APEX Feature may span multiple Modules, and may include subsets of Modules. Scalability The degree to which an APEX Feature enables content created for it to adapt to running on a variety of systems with various degrees of physics simulation capability, and to demonstrate benefit from running on systems with increased physics simulation capability. Scalable Parameter A member of an APEX asset that is authored as a range of values, rather than as a unique value, in order to provide scalability. At run-time, a value in the authored range is selected based on the capabilities of the system.
Немногочисленное русскоязычное сообщество
Количество разработчиков из России и СНГ относительно небольшое, поэтому достаточно трудно найти блоги и обсуждение Apex на русском языке. Вот, например, как выглядят профессиональные сообщества Salesforce-специалистов ВКонтакте
Надо заметить, что в Беларуси разработка на Salesforce стремительно популяризуется. В русскоязычном Youtube появляется всё больше качественных видео про Salesforce и Apex (пример). Количество специалистов растёт, но работы всё ещё больше, чем людей.
Этот минус можно конвертировать в преимущество вас как специалиста на рынке труда. Чем меньше специалистов, тем они дороже.
Почему существующие туториалы — плохие
Я немного поясню, почему я считаю существующие туториалы плохими. Апекс — это не язык программирования, это такой очень высокоуровневый инструмент разработки, ближайшим идейным аналогом которого я бы назвал MS Access. Соответственно, большая часть разработки на апексе состоит из работы с веб-интерфесом этой среды: нажимания на кнопки, перехода по ссылкам, заполнение полей с названиями компоментов, выбора значений из списков и так далее. Что делает типовой туториал? Он показывает скриншоты этих самых экранов с подписями "нажмите туда-то". При этом сама IDE достаточно удобная и понятная, почти все элементы снабжены справочными пояснениями, есть встроенная помощь. В итоге, если нужно объяснить пользователю, как создать приложение, в туториале будет большой скриншот, объясняющий, как нажать на кнопку "Create a new app". Вот, посмотрите сами на официальный оракловый туториал:
Они бы еще объяснили со скриншотами, что "клик" — это однократное нажатие на левую кнопку манипулятора типа "мышь".
Конечно, полезная информация в таких туториалах тоже есть, но ее там крохи. Процентов на 80 туториалы состоят из таких вот скриншотов, причем по своему опыту я могу сказать, что человек, не читавший никаких туториалов вообще, самостоятельно найдет, как создать приложение, добавить страницу, поместить на нее отчет и так далее. А потом ему нужно будет организовать более-менее нетривиальное взаимодействие нескольких элементов апекса, и оказывается, что этот вопрос туториалом почти не покрывается. Приведу аналогию: вы только-только учитесь программировать, изучили переменные, массивы, циклы, условия, и получили задание, в рамках выполнения которого вам нужно отсортировать массив. Как-то отсорировать массив — достаточно просто, но как только задание усложнится до "отсортировать большой массив быстро", окажется, что имеющихся у вас знаний недостаточно. Погуглив, покопав Stackoverflow и форумы, вы найдете алгоритм быстрой сортировки. Конечно, кто-то и сам переизобретет этот алгоритм рано или поздно, но более эффективным путем было бы сразу прочитать книжку с разбором типовых алгоритмов. И вот как раз такого набора "типовых алгоритмов" для апекса обычно нигде нет, а на помощь приходят те же самые метод научного тыка, поисковики, форумы и Stackoverflow (и, я надеюсь, этот туториал).
Резервное копирование
Бэкапы мы кладём на отдельный том. Для этого воспользуемся услугой Volumes хостинга Digital Ocean и после подключения нового раздела к VPS, выполним следующие команды:
Эти команды создают файловую систему, папку для монтирования диска, прописывают параметры автомонтирования при загрузке в файл /etc/fstab и меняют владельцев папки для бэкапов. Запускаем консоль SQL*Plus и меняем параметры резервного копирования:
Для начала мы воспользуемся предустановленным скриптом, осуществляющим резервное копирование с окном восстановления в 2 дня. Первый запуск мы осуществим из консоли, но в дальнейшем будет необходимо добавить этот скрипт в cron пользователя oracle:
После всех изменений нужно будет перезагрузить сервер. Для запуска сервиса oracle-xe вручную и включения в автозагрузку пригодятся следующие команды:
Apex приучает к юнит-тестированию и к test-driven разработке
Покрытие кода юнит-тестами на 75% – обязательное условие для переноса этого кода на PROD-среду. Поэтому вы с самого начала учитесь создавать тест-классы. Это полезный навык – менять ментальный ракурс, с которого вы смотрите на свой код, таким образом, чтобы написать тест.
Salesforce в этом вопросе идет дальше и пропагандирует при разработке начинать с написания юнит-тестов. Это помогает лучше осознать все пользовательские сценарии, которые должен обрабатывать ваш будущий код. Поэтому Apex, как первый язык программирования, не оставляет вам выбора: вы сразу учитесь лучшим практикам и осознанному подходу к процессу разработки.
Пример класса и тест-класса в Apex
Заключение
Apex прекрасно подходит для обучения программированию. Правила и рекомендации Salesforce с самого начала научат вас лучшим практикам ООП, которые применимы к коду на любом другом языке.
Однако, лучше посмотреть в сторону других языков для старта, если:
Вы не планируете профессионально развиваться в качестве специалиста Salesforce;
Вы плохо владеете английским языком. Это затруднит вам изучение любого языка программирования, но Apex - в особенности.
Недавно я с удивлением обнаружил, что, оказывается, толковых туториалов по Oracle Application Express (он же APEX, он же апекс, но не путать с языком apex, который используется в Salesforce) в природе не существует.
Это не самая распространенная технология, конечно, но, тем не менее, довольно востребованная. Есть десятки блогов об апексе (англоязычные, в основном), пара тысяч вопросов на Stackoveflow, специальный раздел по апексу на официальных форумах оракла, сам апекс существует уже 15 лет и все время развивается. Я был уверен, что и хороших туториалов полно. Но нет!
Мне тут же пришла в голову гениальная мысль восполнить этот пробел.
Оглавление
Apex приучает к написанию оптимального, ресурсоэффективного кода
Ресурсоэффективный код в Apex – это не блажь и не рекомендация, а почти необходимое условие. Поскольку Salesforce – это облачная платформа, программные ресурсы у каждого клиента платформы ограничиваются лицензией. Иными словами, ресурсы, которые есть у вас в распоряжении, как разработчика, ограничены лимитами Salesforce.
Код, исполнение которого нарушает лимиты, приведет к системной ошибке и откату транзакции. По этой причине у Salesforce есть рекомендации, которых нужно придерживаться, чтобы писать оптимальный код.
Этот пункт я считаю плюсом Apex, поскольку вы с самого начала привыкаете писать оптимальный код, который экономно распоряжается облачными ресурсами. Это формирует полезный для разработчика способ мыслить.
Apex имеет единую и обновляемую документацию, собранную на портале Salesforce
Salesforce развивает Apex как основной язык для разработки на своей проприетарной платформе, поэтому все обновления и вся документация содержатся на едином официальном портале Apex Developer Guide.
На ней собраны все системные классы и методы, подробно описано их назначение и применение. Можно найти однозначный ответ на большинство вопросов. А вопросов при обучении всегда много.
Установка Application Express
Необходимо загрузить на сервер дистрибутив, который также доступен после регистрации на сайте. Скачивание и распаковка:
В файле oracle_env.sh содержатся переменные окружения, необходимые для работы клиента SQL*Plus, добавим инициализацию этого файла в параметры bash и применим к текущему окружению:
Из консоли SQL*Plus необходимо запустить следующие скрипты:
Последний скрипт @apxchpwd меняет пароль учетной записи admin для Application Express. Следующий шаг в какой-то мере небезопасен, используйте его только когда это действительно необходимо: этой командой разрешаются удаленные подключения к Listener (с использованием SQL-клиентов или различного другого софта), использующего по умолчанию порт 1521:
Рекомендую ограничить подключения к этому порту соответствующим правилом iptables.
При подключении к Listener через интернет, к примеру, с использованием SQL Developer, логины/пароли/запросы передаются в открытом виде. Чтобы этого избежать, необходимо использование SSH-туннеля либо VPN.
Из консоли SQL*Plus изменим другие важные параметры: максимальное число сессий, процессов, т.к. эти параметры не динамические, понадобится рестарт базы. Также перейдем от режима Onlinelog к режиму Archivelog и увеличим лимит дискового пространства, доступного для бэкапов.
Apex можно осваивать в Trailhead-песочницах, без установки и настройки дополнительного софта
В рамках обучения можно иметь одновременно до 10 (!) активных песочниц. Песочницы можно удалять и создавать новые для каждой следующей задачи, а можно работать в одной песочнице по нескольким заданиям сразу. Любая новая песочница создаётся с уже предзаполненными данными, чтобы вы могли сразу начать эксперементировать и не тратить время на заполнение тестовыми данными.
Применимость только для продуктов на платформе Salesforce
Trailhead обучает программированию на Apex с полного нуля
В Trailhead множество обучающих модулей и «троп» (последовательностей модулей). Главный плюс для начинающего в том, что для обучения программированию можно выбрать «тропу», которая предназначена для учеников с нулевым опытом или только с админским опытом. В таком случае обучение начнется с самых основ ООП, а в качестве примеров будет использоваться Apex-код.
Примеры обучающих модулей по разработке на Apex для администраторов
Все модули Trailhead написаны на английском языке. Авторы модулей стараются максимально просто описывать концепции, поэтому языковой барьер быстро перестает чувствоваться.
Текст часто снабжается забавными примерами и просто шутками. Типичный пример на рисунке ниже:
В изучении Apex есть и минусы. Ниже рассмотрю их подробнее.
Читайте также: