Библиотека Aurora



  • Написал библиотеку функций для облегчения работы всем, кто предпочитает делать проекты через код. Использую сам, существенно облегчает написание.

    Задача библиотеки (назвал Авророй) - упрощение работы в коде путём предоставления разработчику простого и структурированного API для выполнения как можно большего числа стандартных действий БАС. К сожалению, далеко не все действия можно впихнуть в функции, (хотя умудрился полукостыльным методом впихнуть невпихуемое в случае с шаблонами).

    В общем, ссылка на скачивание: https://cloud.mail.ru/public/Dtmr/S4TjGgopm

    Подробное описание:

    Библиотека состоит из объектов (на момент написания первой версии их 12 штук), каждый из которых несёт определённый функционал. Объекты содержат функции (которые добавляются по мере выхода новых версий библиотеки), каждая из которых делает определённое действие в рамках функционала объекта.

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

    Каждая функция описана в справочнике, так же указаны необходимые для её вызова параметры. Пример:
    0_1550265374608_asf.jpg

    В верхней строке указано имя функции и аргументы. В нижней в квадратных скобках перед описанием [1.0.0], [1.0.1] указана версия библиотеки, в которой появилась данная функция.

    Сам справочник содержит в виде отдельных экшенов поля с информацией о функциях тех самых 12 объектов:

    0_1550265618717_images4.jpg

    Каждый объект отвечает за свой функционал. Отдельно первым в списке справочник, содержащий методы API BAS.

    Пример использования.

    Объект AURORA содержит две функции:

    • aurora.help() - справка по библиотеке
    • aurora.check() - проверка верссии библиотеки

    0_1550265787167_images.jpg
    Если ваш проект использует функцию, например, версии 1.0.2, то вы можете прописать в OnApplicationStart код вида

    var block = '176998609'
    aurora.check('1.0.2')
    

    И тогда Аврора заставит пользователя обновиться до актуальной версии, в которой эта функция уже есть:
    0_1550266064250_images2.jpg

    Пока что выкладываю версии в обыкновенное облако, но если проект будет пользоваться популярностью, задумаюсь об официальном сайте.

    Как видите, все логи цветные, за вывод логов отвечает отдельный объект alg{ };

    Изучив его функции в справочнике вы можете увидеть, зачем в приведённом выше коде есть переменная block, содержащая id блока вашего кода.

    Весь вывод лога построен на виде:
    [номер потока][id блока][текущее время][имя функции/аккаунта]текст лога.
    Можно так же без переменной [имя функции/аккаунта].

    Сразу расскажу про именование объектов. Задача была - создать как можно более простые трёхбуквенные имена, не пересекающиеся (что важно) с именами возможных переменных.

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

    Потому вместо var log = {} Аврора использует var alg = {} и т.д.
    alg в данном случае означает "aurora log", значение сокращений в именах всех объектов описаны в библиотеке.

    Пример вызова функций объекта alg:

    var block = '176998609'
    alg.allcolors()
    

    выведет список всех доступных цветов и их кодировки в RGB:
    0_1550266891714_images3.jpg
    Запрос цвета происходит ПО ИМЕНИ ЦВЕТА, а не по RGB:

    [[RED]] = alg.color('красн')
    

    А вот в переменную по запросу выводится код цвета в RGB:
    0_1550268691725_images8.jpg
    Цвет лога указывается через три звёздочки(***):

    var block = '176998609';
    alg.one('Пример зелёного лога***зел')
    alg.name('ok.ru','Фирменный цвет "одноклассников"***ок')
    

    0_1550269037368_images9.jpg

    Если не указывать в логе цвет, лог будет серым:

    var block = '176998609'
    alg.one('Пример серого лога')
    alg.name('Имя','Пример серого лога с именем')
    

    0_1550267644074_images5.jpg

    (для обозначения имени аккаунта я выбрал синий цвет, в приведённой ниже таблице цветов он называется "name" или "имя" и присваивается имени автоматически, для вывода имени функций выбрал коричневый - "func", "функц", "функ")

    Если не указать в коде перед вызовам функций, завязанных на лог, идентификатор блока в переменной block, Аврора попросит указать айдишник:

    alg.one('Лог, который не будет выведен без указания id блока')
    

    0_1550267951984_images6.jpg
    Я думаю, это не лишнее, указать id блока просто, это нужно сделать только однажды в начале блока, а с ним отладка и контроль проекта полегче будет. Дополнительно используйте имена и цвета чтобы ориентироваться в логе было просто.

    Для тех, кто не знает, что такое идентификаторы блоков:
    0_1550268290086_images7.jpg
    Далее, можно выводить лог с двумя и тремя цветами:

    var block = '176998609';
    alg.one('Лог одного цвета***зел')
    alg.two('В этом логе***жёлт','два цвета***бел')
    alg.three('Ссылка на гугл***усп','google.com***син','синего цвета***авито')
    alg.name3('avito.ru***авито','Фирменный цвет***ok','Авито***авито','зелёный***ок')
    

    0_1550269551550_images10.jpg
    На практике мне никогда не пригождалось больше трёх цветов, но если будет запрос, сделаю функции с большим их количеством.

    Достаточно подробная документация позволит легко воспользоваться любой функцей.

    Например, щёлкнув в выпадающем меню на нужную функцию
    0_1550270801468_q1.jpg
    Вы можете копировать текст из поля
    0_1550270818010_q2.jpg
    И вставить в ваш код:

    [[TEXT]] = 'Текст Без Пробелов'
    [[TEXT_RESULT]] = atx.spaces([[TEXT]])
    

    0_1550271163431_q4.jpg



  • @pragmatik ничего себе!
    Кстати, не думал о github?



  • На момент написания этого поста aurura это:

    • версия 1.0.1
    • ровно сотня доступных функций:
      0_1550271929843_q5.jpg
    • 653 строки кода
    • 37 килобайт кода плюсом к каждому потоку BAS
    • 33 килобайта в заархивированном виде и 148 в распакованном
      0_1550272105076_q6.jpg

    В планах развития:

    Используйте библиотеку, экономьте своё время и дополняйте её своими функциями. Делитесь этими функциями прямо здесь, а я включу их в следующие релизы.

    В свою очередь я, как разработчик, гарантирую следующие незыблемые принципы развития проекта:

    • полная обратная совместимость. При обновлении версий все старые функции будут работать так же, даже если их код претерпит изменения. Это значит, что при обновлении до новой версии библиотеки, весь старый функционал будет работать без сбоев и вам не нужно будет беспокоится за свои проекты.
    • расширяемость. Библиотека может дополняться новыми объектами и функциями, старый набор функций остаётся без изменений.
    • модульность. Новые функции могут использовать функционал старых функций. Одни функции используют функционал других. Так, например, функция вывода лога использует функционал ещё трёх-четырёх функций для вывода (за номер потока, вывод времени, цвет лога отвечают отдельные функции).

    P.S. сообщайте о багах,если таковые будут выявлены :)



  • @uraabk подумываю, насколько это удобно? Можно же просто скачать и поставить.



  • @pragmatik удобность - это кому как. А вот "Актуальная версия библиотеки..." красивее будет выглядеть с github, чем с майлом и изменять её не надо будет)



  • @uraabk ну это можно. Тогда выложу как будет время. И укажу в следующей версии ссылку на репозиторий.



  • Простите за нескромный вопрос - но чем это облегчает работу? Как по мне так наоборот усложняет ) Использование аргументов на кирилице ваще нечто )) Эдакие екселевские суперфункции с божественным синтаксисом понятным толкьо избранным. В остальном хз даже, самые примитивные функции js просто переименованы .... зачем? ) Мб в дальнейшем конечно вытечет в какой то полезный фреймворк но пока что мне не понятно



  • @qwaros во-первых, где вы увидели функции на кириллице?

    Во-вторых, щас объясню на пальцах чем именно упрощает.

    Откройте engine.js и посмотрите любую функцию. Чать из них завязана на api баса, но даже если брать их, то мы должны будем писать в коде, например:

    	eval('var regexp_result = native("regexp", "first", JSON.stringify({text: content,regexp:"'+ regexp +'"}))')
    	if(regexp_result.length == 0){regexp_result = []}else{regexp_result = JSON.parse(regexp_result)}
    	var result = regexp_result.pop()
    	if(typeof(VAR_TV_0) == 'undefined' || !VAR_TV_0){VAR_TV_0 = ""}
    	var result = regexp_result[0]
    	if(typeof(result) == 'undefined' || !result){var result = ""}
    	if(regexp_result.length == 0){var result = VAR_TV_0}
    	return result
    

    Чтобы получить первое вхождение регулярки.

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

    var first = are.first(regexp,content)
    

    Эту функцию реально запомнить и просто вызвать.

    Да, подавляющее меньшинство функций завязаны на простые функции js и простые api баса, но посмотрите объект als. Это пример моего отношения к простым функциям js - сложный функционал, который писать муторно, я заменил на свой API, а вот простые функции указал в справочнике в примечании, чтобы даже новички могли пользоваться ими, а не моим API, попутно изучая JS.

    В общем, вместо страницы кода, используя эту библиотеку, можно получить два-три "абзаца", если можно так выразиться. К этому и стремлюсь - ускорение и упрощение программирования.

    На потоки влияет вроде не сильно, пока что это ещё небольшая библиотека. А компилятору всё равно, какие функции вставлять в готовый проект и откуда.



  • @pragmatik
    Опытным пользователям этот модуль конечно никчему. А вот новичкам что бы пользоваться блоками - нормально. Но есть проблемы в еффективности. У вас много функций, которые просто внутри себя вызывают ОДНУ другую. Какой смысл этого копипаста кода? Вы в свои визуальные блоки можете вставлять первозданные функции.



  • @drprime всё потому, что библиотека изначально разрабатывалась под задачу полного ухода от визуальных блоков (за исключением if-else и некоторых циклов). Можно, конечно, написать визуальные блоки, но лично я предпочитаю делать всё,что только возможно, в коде. Кому интересно - пусть переделывают библиотеку под экшены.

    А по поводу вложенных функций - я не думаю, что это сильно нагружает проект, функции простые и выполняют несложные действия. Вложенность у меня тоже небольшая, хотя в блоках encode и decode нужно подключение внешней библиотеки CryptoJs - ещё плюс 48 килобайт кода к каждому потоку (что в общем-то тоже немного). Разве что алгоритмы более сложные, возможно что всякие действия по кодированию-декодированию хорошо загрузят процессор. А у меня особо сложных действий вроде нет.



  • @pragmatik Тут вопрос в другом. А какой тогда смысл человеку запоминать функции Вашего модуля, если можно просто запомнить функции js и bas?
    Я беглым взглядом насчитал 20 функций, которые просто копируют другие функции.

    Но, я понимаю что Вами проделана большая работа.
    Дам пару советов по оптимизации кода, это на будущее поможет Вам писать код лучше.

    • Убрать все eval(). Кокой смысл от них?
    • Оптимизировать возврат функции. У вас много ненужных промежуточных переменных.
      Например
    asf.thread = function(){
        var thread_index = thread_number(); 
    return String(thread_index)
    }
    

    Лучше будет так

    asf.thread = function(){
    return thread_number().toString()
    }
    
    • Убрать непонятные символы в функциях
      Например
    ahc.getheader = function(header){
    	_switch_http_client_main()
    	http_client_header('"'+header+'"')
    }
    

    Нужно так

    ahc.getheader = function(header){
    	_switch_http_client_main()
    	http_client_header(header)
    }
    

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

    agf.tmp_asynch = function(string){
        _if(true, function(){
        _template('"' + string + '"')!
        VAR_TMP = _spintax(_result()).replace("BASASYNC","\)\!")})!
    }
    agf.tmp = function(string){
        agf.tmp_asynch(string)
        var result = VAR_TMP
        var result = result.slice(1)
        var result = result.substring(0, result.length - 1)
        return result
    }
    

    Вот у вас 2 функции.
    В первой Вы скопировали в нее ненужный асинхронный _if()!
    Во второй Вы вызываете асинхронную функцию неправильно.
    То что она работает - случайность.
    Хотя 2 этих функции можно заменить одной

    agf.tmp = function(string){
        return _spintax(string)
    }
    


  • @drprime said in Библиотека Aurora:

    Но, я понимаю что Вами проделана большая работа.
    Дам пару советов по оптимизации кода, это на будущее поможет Вам писать код лучше.

    Убрать все eval(). Кокой смысл от них?
    Оптимизировать возврат функции. У вас много ненужных промежуточных переменных.
    Например

    Да, на счёт оптимизации возвратов я полностью согласен. Где успел, сделал return правильно, но в некоторых копипастил из старого кода, ещё не просматривая.
    Со _spintax - просто не знал как это работает, потому заменил на костыль в виде этих двух функций. В следующем релизе сделаю так.
    А вот с eval дело другое. Eval у меня только там, где без него не работает, по крайней мере в блоках кода. Хотя, я,если честно, те же самые функции без eval в библиотеке не тестил. В следующем релизе их переберу, если заработает без eval, оптимизирую.



  • @drprime said in Библиотека Aurora:

    А какой тогда смысл человеку запоминать функции Вашего модуля, если можно просто запомнить функции js и bas?

    Кстати, не призываю никого заменять знания js и BAS занием моей библиотеки. Напротив, лучше, если человек уже выучит js и api BASa и после, как и я, задумается об оптимизации кода. На вопрос "зачем" отвечу вашим же примером кода в таком случае:

    Чтобы не писать (или не копипастить) код

    _switch_http_client_main()
    http_client_header(header)
    

    А быстро ввести то, что запомнить проще:

    ahc.getheader(header)
    

    Согласитесь, даже agf.tmp() написать быстрее и проще, чем return _spintax(). Несмотря на то, что редактор кода произошёл от IDE-шки, писать длинный код в нём не так удобно, а уж серьёзные большие функции и подавно. Но сам редактор отличный, напрягает только отсутствие тёмного скина.



  • @pragmatik чтобы получить первое вхождение регулярки можно не прибегать к методам древних шаманов а заюзать простой match() с выборкой [0] из результата... нарпимер

    var find = "my text for regex".match(/regex/i); 
    alert(find[0]) // выведет "regex"
    

    Имхо тоже реально запомнить ну или загуглить если лень запоминать

    В целом хз )) Буду наблюдать за развитием, начинание безусловно хорошее :)



  • Самый большой недостаток сторонних библиотек, что их не будет в скомпелированном скрипте. Можно конечно сам код добавлять скрипт. Но не вижу смысла в таких костылях для использования стандартного функционала.



  • Кстати @Pragmatik если ты научиш свою либу хранить кастомные сиппеты и вставлять их нажатием парой кликов это будет просто огонь )) я б только из за этого ее юзал постоянно :D



  • @qwaros said in Библиотека Aurora:

    Кстати @Pragmatik если ты научиш свою либу хранить кастомные сиппеты и вставлять их нажатием парой кликов это будет просто огонь )) я б только из за этого ее юзал постоянно :D

    Код в редакторе кода пишется вручную, так как у редактора движок от какой-то IDE, похоже на visual studio code или на phpstorm. В эту сторону можно копать, если узнать какой именно движок используется, к нему при любом раскладе можно писать расширения. Но и то это довольно сложно будет. Потому я и делаю вместо сниппетов функции, их можно легко копипастить из справочника.



  • Пример использования библиотеки:

    // Читаю из ресурса proxy прокси
    VAR_PROXY = asf.res("proxy")
    // Устанавливаю прокси на http-клиент
    ahc.proxy(VAR_PROXY)
    // Проверяю, установились ли прокси
    _switch_http_client_main()
    http_client_get2("https://2ip.ru/",{method:("GET"),headers:("")})!
    var content = ahc.content()
    var regexp = "<big[\\s\\S]+\?>([\\s\\S]+?\)</big>"
    var check = are.check(regexp,content)
    if (check){
        alg.name('Проверка прокси', 'HTTP-прокси успешно установлен***success')
    }else{alg.name('Проверка прокси', 'HTTP-прокси не установлен!***error')}
    


  • @usertrue said in Библиотека Aurora:

    Самый большой недостаток сторонних библиотек, что их не будет в скомпелированном скрипте. Можно конечно сам код добавлять скрипт. Но не вижу смысла в таких костылях для использования стандартного функционала.

    Кстати, есть для этого какое-то решение? Я вот вижу разве что функцию, которая будет записывать все использованные в проекте функции в массив, а потом перед компилляцией по команде весь этот массив сохранять в файл. А потом уже этот код можно добавлять в начало проекта. Надо будет обязательно реализовать, потому как пока что вручную перекидываю из библиотеки в скрипт... Кстати, можно ещё добавлять файлы библиотеки в готовый проект.



  • @pragmatik код из enjine.js поместить первым блоком в скрипте