суббота, 12 февраля 2011 г.

Zeta 3 - решена проблема профилей пользователей

В Zeta2 практически отсутвовали как таковые профили пользователей, практически ничего не подстраивалось под пользователя. Основаная причина - отсутствие общего механизма взаимодействия JavaScript<->Server в части унифицированного обмена данными о преференциях пользователей.

В Zeta3 инфраструктура унифицирована как по организации хранения так и по организации доступа.

  • На уровне ядра:
    • созданы удобные утилиты доступа к папке profile и записи, навигации, чтения в ней.
    • создана ингфраструктура общего хранения профилей (может использоваться не файловая система) в этом случае поддерживаются только операции чтение - запись
  • На уровне контроллеров
    • во все контроллеры внедрены защищенные методы записи и чтения в профиль
    • планируется - организация доступа к профилю из вьюх, пока вопрос не решен
    • добавлен публичный контроллер profileController с методами load/save для запросов на открытие и сохранения файлов профиля через AJAX
  • На уровне клиента
    • создан скрипт comdiv.profile.js, экологический как для загрузки в рут, так и в eval режиме
    • обволакивает profileController , поддерживает автосохранение профилей, в качестве формата хранения использует JSON
Теперь работа с профилем на уровне клиента стала элементарной:

var profilerepos = Ajax.from(siteroot+"/scripts/comdiv.profile.js").eval();
var myprofile = profilerepos.load('myprofile',{val1:'default1',...}); //нуказываем имя файла профиля и настройки по умолчанию
myprofile.autoSave(10); //включаем, если надо автосохранение
...
myprofile.data.val1 = 23;
myprofile.data.val2 = 'xxxx';
...
//максимум через 10 секунд новые значения будут сохранены если они в действительности изменились
//и при следующей загрузке в профиле уже будут новые значения

четверг, 10 февраля 2011 г.

Zeta 3 - четкая модель для подключения расширений.

В Zeta2 расширения хрванились в виде набора файлов *.boo в корне директрий /extensions/ (usr/extensions .. и т.д.). Первоначальное предназначение расширений было только спецклассы расширения функциональности. Однако более частой задачей было создание дополнительных контроллеров или целой группы функциональности. При этом обнаруживалась серьезная проблема, что все ресурсы Zeta2 были централизованы, так для регистрации *.brail пришлось бы использовать папки views, для JS - scripts, для css - content/style, для рисунков content/image.

Соответственно установка расширения и его сопровождения были крайне сложны.

В Zeta3 появилась возможность создавать контроллеры расширений в виде пакетов.  Пакет состит из именованной папки , имя папки ДОЛЖНО совпадать с именем файла boo в ней и именем КОНТРОЛЛЕРА, который регистрируется в качестве основного в расширении. Папка пакета автоматически является носителем видов контроллера.
Расширения наследуют контроллер ExtensionsBaseController, в котором доступен специальный объект расширения ExtensionsHelper, позволяющий удобно разрешать имена файлов (при этом с соблюдением слоистости, любой файл расширения может быть перекрыт более высоким слоем, например usк/extensions/ext1/default.css перекроет sys/extensions/ext1/default.css.

Соотвественно раньше пакет (например пакет BXLTESTER) выглядел и устанавливался так:
ZETA2

  • bxltester
    • bxltester.boo -> sys/extensions/bxltester.boo 
    • bxltester.js -> scripts/bxltester.js - нарушается структура ответственности - то что принадлежит sys вынуждено находиться в корне, нарушается стройность SVN версионности приложения
    • bxltester.css -> sys/content/style/bxltester.css - как и в предыдущем номере нарушается версионность всего приложения, плюс мы вынуждены синхронить не только имена папки-BOO-контроллера (что вполне логично), но и всех ресурсов
    • index.brail -> sys/views/bxltester/index.brail - опять версионность + дублирование папки
Очевидно что сопровождать, обновлять такой пакет не нарушая всего приложения крайне сложно,  в частности поэтому расширения почти не использовались не смотря на всю их мощь.

Теперь в ZETA3 :
  • bxltester -> папка просто целиком копируется в extensions на нужном уровне, например sys/extensions
    • bxltester.boo
    • default.js - можно использовать любые имена, включая default, который распознается системой
    • default.css
    • index.brail
Таким образом новые расширения экологически чисты для приложения, легко устанавливаются одной командой XCOPY или MLINK и могут быть целой папкой завязаны на один корень SVN.
Особенно это все сыгрывает вместе с новым загрузчиком расширений.

среда, 9 февраля 2011 г.

Принципы Zeta3

Все, пора собирать общефилософские принципе жизни с Zeta3, зная их и админ и разработчик расширенй лучше разберется с системой и даже найдет ответы на те вопросы, ответа на которые пока не знает...
  • ZETA3 - ЛИЦОМ К АДМИНУ И КОНСТРУКТОРУ
  • ПРАКТИКА ВАЖНЕЕ ГИБКОСТИ
  • ОБЩЕЕ ДАЕТ ДОРОГУ ЧАСТНОМУ
  • ЧТО МОЖЕТ *.BAT НЕ ДОЛЖНО IIS
  • вся конфигурация системы - в виде файлов на языке BXL - заменителе XML, надо знать, уметь пользоваться
  • вся безопасность - на ролях, кроме принадлежности пользователя к предприятию - на ролях, любой вопрос открыть доступ к тому, закрыть к сему решается через привязку пользователя в роль со специальным именем
  • новый функционал - в расширениях - добавление небольшой функциональности делается в папках extensions через API

Zeta 3 - облегченное управление правами на выполнение операций

Проблема в Zeta2.
В Zeta2 присутствовал гибкий механизм определения прав доступа на выполнение операций, централизованный с общей системой безопасности на основе токенов. При крайней гибкости данного решения, оно не оправдало себя:

  1. Было неудобно в разработке, 90% случаев решалось через атрибуты Admin, Public, Role и миновало ACL
  2. Низкая производительность
  3. Крайне неудобно для админов, так никто из действующих админов не научился писать правила доступа к веб-коммандам.
  4. Не востребованным оказался механизм предпроверки параметров - все равно параметры по безопасности потом приходится проверять в коде.
  5. Много внимания было уделено всяким непроизводительным резольвингам динамических действий и асинхронных методов, хотя на практике не пригодилось
Соответственно в Zeta3 подход пересмотрен.
  1. Оставлен только механизм на основе ролей и атрибутов контроллера Roles и его упрощенных форм Public, Admin
  2. Механизм арсширен за счет СПЕЦИАЛЬНЫХ РОЛЕЙ при помощи которых администратор может провести "тюнинг" доступа - это на смену ACL
  3. Доступ по умолчанию сменен на ОТКРЫТЫЙ, ранее было ЗАКРЫТЫЙ - неудобно при формировании малых приложений и виджетов
Обзор

Для разработчиков
При создании контроллера ему самому и его действиям следует назначить роли, которыми должен обладать пользователь для доступа к ним.
Помним, что по умолчанию контроллер, действие ДОСТУПНЫ, а ADMIN будет иметь доступ независимо от настроек
[Roles("r1,r2")] - элемент доступен администратору, и ролям r1 и r2 (любой из них)
[Admin] == [Roles("ADMIN")]
[Public] == [Roles("DEFAULT")]
  • Если и у действия и у контроллера указан атрибут - то используется настройка действия
  • Если у контроллера есть атрибут, а у действия нет - используется атрибут контроллера
[Controller]
[Admin]
class controller1 :
          [Public]
          def action1() :
                   pass
controller1/action1 - доступен всем
[Controller]
class  controller2:
          [Admin]
          def action1() :
                   pass
           def action2():
                   pass
controller2/action1 - доступен только админам
controller2/action2 - доступен всем

Для администраторов

Нужно знать имена контроллеров и действий, или хотя бы уметь определять их по URL, так в адресе http://myserver/myapp/zeta/start.rails - ZETA - имя контроллера, START - имя действия
Из названия контроллера и действий можно делать СПЕЦИАЛЬНЫЕ РОЛИ:

  1. Разрешающая роль уровня действия - допустим есть команда execute, контроллера tasks, доступная только админам, а надо дать постоянный или временный доступ именно к этой команде пользователю domain\user1, в этом случае в файле привязки ролей можно написать map "domain/user1", "ALLOW_TASKS_EXECUTE"
  2. Разрешающая роль уровня контроллера (группы комманд) - задача аналогичная предыдущей, но роль чуть другая map "domain/user1", "ALLOW_TASKS"
  3. Запрещающая роль уровня действия - допустим есть контроллер form, имеющий метод addattachment  для добавления приложений, form доступен всем членам роли OPERATOR. Вы хотите чтобы пользователь  domain/user1 не теряя доступа в целом к операциям формы не имел права добавлять приложения, в этом случае поместите его в роль  map "domain/user1", "DENY_FORM_ADDATTACHMENT"
  4. Запрещающая роль уровня контроллера - та же мотивация, только более широкая область запрета map "domain/user1", "DENY_FORM" - запрет доступа ко всем операциям контроллера FORM
Мне кажется, что в такой конфигурации настроек безопасности в выигрыше все - у программистов простые и понятные правила игры, у админов прямая возможность без лишних знаний и инструментов тонко настраивать доступ, приложение выигрывает в производительности и менее ресурсоемко.

среда, 2 февраля 2011 г.

Zeta3 - изменения языка описания тем

Дружественный синтаксис импорта элементов
Это самое значимое изменение синтаксиса. Решает серьезную проблему использования XPath в предыдущей версии. Пользователи, конструкторы в принципе не понимали конструкций типа embed "((_SELFELEMENT/reprotset[@id='${id}'])[position()=last()])/*" и могли только как-то случайно догадываться что же происходит при ее выполнении.
Вместо зубодробительного оператора embed, перенесенного теперь в ядро загрузчика BXL и выполняющего системные функции и замены введен оператор include.
include позволяет указать имя элемента, его идентификатор, из какого источника взять (по умолчанию текущая тема) и как использовать (взять самый последний, объединить из всех импортированных тем и т.п.).
include выполняется ПОСЛЕ применения параметров в конструкции ${paramname} и при этом правильно ведет себя с подстановками параметров в виде ${paramname}:
при стандартном импорте из текущей темы все уже итак настроено на текущую тему,
при импорте из другой темы все импортируется как есть без попыток приписать свои значения,
при импорте из глобальной области (где заведомо еще не было применения параметров) - параметры повторно применяются.


Полный синтаксис include (в квадратных скобках [..] указаны необязательные элементы, вертикальная черта "|" разделяет варианты, курсивом parameter указаны части в которые требуется поставить пользовательское значение:
include ELEMENTNAME, ELEMENTID [,all] [,outer] [,source=root|THEMACODE]
где 
  • ELEMENTNAME - имя элемента который требуется включить, например reportset, reportsetex
  • ELEMENTID - код (ИД) элемента
  • all - означает, что надо объединить содержимое всех элементов (по умолчанию берется последний, дочерняя тема переопределяет импортированные)
  • outer - означает, что нужно взять элемент целиком (по умолчанию берется СОДЕРЖИМОЕ элемента)
  • source - источник элемента, по умолчанию - текущая тема, source=root  запрашивает данные из всего файла тем, от корня, source=THEMACODE запрашивает данные из указанной темы.
ПРИМЕРЫ:

1. Простая заготовка под перекрытие в дочерних темах

thema t1:
       item i1 :
                include reportset, Aa
       reportset Aa :
                col mycol

thema t2 :
       imports t1
       reportset Aa :
                col c1
Во второй теме появится:
item i1 :
        col c1
а mycol будет перекрыт

2. Простая заготовка под расширение в дочерних темах

thema t1:
       item i1 :
                include reportsetex, Aa

       reportsetex Aa :

                col mycol
thema t2 :
       imports t1
       reportsetex Aa :
                col c1
В теме t2 будет и колонка c1 и колонка mycol  в прямом порядке наследования

3. Использование корня тем с пост подстановкой параметров

thema t1:
       rootrow=myrow
       item i1 :
                include reportset, mainrow, source=root
....
#где-то может вообще в другом файле
reportset mainrow :
         row "${rootrow}"

В итоге в t1 будет:
item i1 :
        row myrow

4. Импорт контента из другой темы (пока видно одно полезное использование - можно сделать псведотему с одним префиксом безопасности и затащить в нее отчеты, формы в готовом виде из других тем, без полного импорта темы)

thema t1 :
           item i1 :
                     row row1
           item i2 :
                     row row10

thema t2 :
           item i1 :
                     row row2
           item i2 :
                     row row20
thema t3 :
          include item, i1, outer, from=t1
          include item, i2, outer, from=t2


Теперь в t3:

thema t3 :
          item i1 :
                     row row1
          item i2 :
                     row row20
Причем если были подстановки ${paramname}, сохранятся значение ИСХОДНЫХ тем

ПРОЧИЕ НОВОВВЕДЕНИЯ
  • Упрощенный автоимпора
для того чтобы тема могла использовать код другой в качестве имени элемента с автоимпортом целевая тема не обязана быть абстрактной, так, теперь вполне работает:
thema t1 
t1 t2
t2 t3
что эквивалентно:
thema t1
thema t2:
          imports t1
thema t3:
          imports t2
Ранее же, t1 и t2 были обязаны быть абстрактными.
  • Упразднена разница между abst и this.active=false
Сама по себе абстрактность темы эквивалентна ее неактивности, никакого большего смысла эта конструкция не несет и упраздняется, abst оставлен для совместимости и более простого кодирования, для самой же системы abst - эквивалент this.active=false
  • Автоматическая проверка наличия циклических связей
  • Имя темы по умолчанию равно коду темы
  • Более четкая модель сведения импорта и уровней тем (исключает конфликты порядка описания тех или иных элементов)
В частности не имеет больше значения порядок описания параметров.
Так если раньше:
thema t1 :
      x="x${y}x"
      y="y${z}y"
      z="z"
привело бы к  неправильному результату:
thema t1 :
      x="xx"
      y="yy"
      z="z"
То теперь все нормально:
thema t1 :
      x="xyzyx"
      y="yzy"
      z="z"
  • Более четкая модель поддержки генериков
Конструкция ZZindexZZ  заменяется ZZZ, генерики обрабатываются ДО основных тем без резольвинга параметров, но с прошивкой своих кодов в генерики.

суббота, 29 января 2011 г.

Zeta3 - продвинутый загрузчик расширений

В Zeta2 процесс загрузки расширений был достаточно длительным и не кэшировался, при этом приложение "съедало" весьма немало ресурсов.

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

Ожидается серьезное ускорение загрузки и одновременная экономия ресурсов.

Инфраструктура в целом готова , инструкция ВОТ

воскресенье, 23 января 2011 г.

Zeta3 - более полное применение XML/BXL

В Zeta2 для конфигурации тем был анонсирован язык BXL, явлюящися BOO-заместителем с определенным функционалом для обобщения кода (глобальные переменные, подстановки, генераторы и т.д.)

В Zeta3 данный подход обобщен для общего использования (не только в темах):
  • любой файл XML в конфигурации может быть заменен аналогичным файлом BXL
  • как и BXL так и XML и любой файл может использовать расширения - глобальные переменные, подстановки и др.