Базару 0, инфа добрая. Хотя про аварийные ситуации уже не ваша должна быть проблема... Главное чтобы программа после перезапуска работала стабильно, остальное уж не стоит брать во внимание как по мне. Еще тест на чистую машину тоже хз, обычно софты на дедиках запускают, а там каждый хостинг сам выбирает что блочить и как работать, так что..
Лайфхаки BAS
-
Для читабельности созданной в BAS конструкции разработчик рекомендует использовать функции. И отделять таким образом логические разделы скрипта.
Однако у этого метода есть свои недостатки (пусть кому-то они и покажутся мелочными):- Если следовать рекомендациям разраба, многие функции будут использованы лишь один раз, что противоречит общей идеологии функций в программировании. Они просто будут захламлять список функций и усложнят поиск тех, которые используются в скрипте по нескольку раз.
- При копировании функций из одного скрипта в другой, необходимо предварительно объявить функцию. А лучше - объявить, вызвать и скопировать все действия. Встречал ошибки при несоблюдении подобной последовательности (возможно из-за кривизны рук).
Для решения задачи из п.2 применил простой и доступный всем метод:
Разделение логических разделов скрипта через условный оператор IF и единичку в условиии с описанием раздела. Увидев скриншот сразу станет понятнее:

После добавления функционала сворачивания вложенных конструкций стало совсем удобно. При необходимости каждый раздел разворачивается и нужные данные редактируются. Для пущей красоты можно раскрасить "разделы".
С таким разделением можно не боясь проблем копировать готовые конструкции из одного скрипта в другой. В приведенном скриншоте каждый из разделов создавался отдельно, каждый в автономном скрипте.Конечно же у этого метода есть недостатки связанные исключительно с отсутствием у них возможностей функций, а именно:
- Удалив конструкцию, она пропадет из скрипта навсегда, тогда как при использовании функций вложенные действия остаются объявленными и их можно снова вызвать.
- Не получится использовать рекурсию. Частично заменил метками. Использовать их рекомендую только в самых простых конструкциях.
- Если очень хочется запустить часть скрипта в несколько потоков, всё-таки придется использовать функции =)
Можно использовать такой метод для многократного повторения однотипных действий в скрипте. Аргументов у функций в BAS по прежнему нет. Так что можно как при использовании функций, объявить или присвоить значение какой-либо переменной, которая будет использоваться уже внутри конструкции. Однако следует помнить, что вновь добавленные в конструкцию экшны не будут добавлены в скопированные. Так что тут удобство сомнительно. Тут уж на вкус, цвет и внимательность.
Оперировать кубиками в таком скрипте намного удобнее, чем в функциональном. Не нужно искать нужную функцию в списке. К тому же всегда видно, что и где будет использоваться.
Может уже было. Может кому-то бесполезно. Жду факелы =)
-
Есть ещё одна вещь, ради которой я не хочу создавать отдельную тему. Но вряд ли её кто-нибудь заметил.
Это появление плагина Spoiler на форуме. Для создания спойлера можно воспользоваться кнопочкой на панели:

После нажатия появится код
Который на форуме будет выглядить вот так:


Важные момент в переопределении функций BAS, выполнять код нужно для каждого потока.

Вот тестовый скрипт
-
@gamid В смысле...?
Если в ручную вводить, то лучше тогда копировать ID экшена, в котором производится вызов функции и передать его аргументом (в принципе, как вариант). Но, тут есть одно неудобство. При перемещении блока его айдишник изменяется, т.е, каждый раз желательно менять значение аргумента вручную.
Я надеялся, что, может, есть какая функция или переменная, которая уже в себе имеет значение айдишника текущего экшена... -
@fox Немного пошаманил тут над вашими сорсами и написал универсальный log_html()
Функция, также, как и обычный log() выводит айдишник экшина с той лишь разницей, что он не кликабельный.
В общем, пользуйтесь, кому надо:/** _LogHTML() * * @param [mix] text - text to log * @param [string] color - text color * @param [string|Array|Object] define - print parameters * Empty define print all data * [string] ('id, time, thread'), empty string, print only text * [Array] (['id', 'time', 'thread']), empty array, print only text * [Object] ({id: true, time: true, thread: true}), empty object, print only text * @example ({id: false, time: false, thread: false} == {}), * @example ({id: true, time: false, thread: false} == {id: true}) */ function _LogHTML(text, color, define){ var id, time, thread, logHtml; define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define; if(typeof define === 'object' && define !== null){ if(Array.isArray(define)){ id = define.indexOf('id') > -1; time = define.indexOf('time') > -1; thread = define.indexOf('thread') > -1; } else{ id = define.id == true; time = define.time == true; thread = define.thread == true; } } else id = time = thread = true; id = id ? '<span style="color: grey">[' + ScriptWorker.GetCurrentAction() + ']</span>' : ''; time = time ? ' ' + getTime() : ''; thread = thread ? ' Поток №' + thread_number() : ''; logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : ''; logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>'; function getTime(){ var checkTime = function(i){ return (i < 10) ? "0" + i : i; }; var d = new Date(); var hh = checkTime(d.getHours()); var mm = checkTime(d.getMinutes()); var ss = checkTime(d.getSeconds()); return '[' + hh + ':' + mm + ':' + ss + ']'; }; Logger.WriteHtml(logHtml, text); } -
@yumilen said in Лайфхаки BAS:
@fox Немного пошаманил тут над вашими сорсами и написал универсальный log_html()
Интересный вариант, редко на форуме встретишь красивый, качественный код.
Только в файле лога будет неразбериха:

ни каких опозновательных данных:

Потому что в функции log_html() два атрибута:
log_html("<span style='color:yellow'>ТЕКСТ который отображается в логе</span>","ТЕКСТ который записывается в файл лога")а вы записываете в лог только текст:
Logger.WriteHtml(logHtml, text);
Функция, также, как и обычный log() выводит айдишник экшина с той лишь разницей, что он не кликабельный.
Чтобы id был кликабельным, можно указать на него ссылку:
log_html("<a href='action://action366852852' style='color:gray;'>[366852852]</a>")
Вот версия вашей функции с кликабельным id и обычной информацией в текстовом логе:
/** _LogHTML() * * @param [mix] text - text to log * @param [string] color - text color * @param [string|Array|Object] define - print parameters * Empty define print all data * [strijng] ('id, time, thread'), empty string, print only text * [Array] (['id', 'time', 'thread']), empty array, print only text * [Object] ({id: true, time: true, thread: true}), empty object, print only text * @example ({id: false, time: false, thread: false} == {}), * @example ({id: true, time: false, thread: false} == {id: true}) */ function _LogHTML(text, color, define){ var id, time, thread, logHtml, textLog; define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define; if(typeof define === 'object' && define !== null){ if(Array.isArray(define)){ id = define.indexOf('id') > -1; time = define.indexOf('time') > -1; thread = define.indexOf('thread') > -1; } else{ id = define.id == true; time = define.time == true; thread = define.thread == true; } } else id = time = thread = true; id = id ? '<a href="action://action' + ScriptWorker.GetCurrentAction() + '" style="color:gray;">[' + ScriptWorker.GetCurrentAction() + ']</a>' : ''; time = time ? ' ' + getTime() : ''; thread = thread ? ' Поток №' + thread_number() : ''; logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : ''; logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>'; textLog = '[' + ScriptWorker.GetCurrentAction() + ']' + time + thread + ' : ' + text function getTime(){ var checkTime = function(i){ return (i < 10) ? "0" + i : i; }; var d = new Date(); var hh = checkTime(d.getHours()); var mm = checkTime(d.getMinutes()); var ss = checkTime(d.getSeconds()); return '[' + hh + ':' + mm + ':' + ss + ']'; }; Logger.WriteHtml(logHtml, textLog); }

Вот тестовый скрипт
-
@fox Да, спасибо. Не знал как сделать кликабельность, а с выводом лога в файл не заморачивался, поскольку редко использую.
Общими усилиями функция доведена до нормального рабочего состояния и это хорошо.
Не плохо было бы ее еще замостырить в какой-нибудь экшин с соответствующими полями и чеками, а если б еще какой Colorpicker, то вообще было бы супер, но я еще пока толком не разобрался с разработкой модулей, хоть и имею общее представление и при сильном желании мог бы упаковать, но, это, пока, не в приоритете.
Еще, интересно, возможно ли, в файле, вместо стандартного black и red указывать значение параметра функции color? -
@fox И еще, на счет кликабельности...
Если бы разработчик увеличил время подсветки экшина после клика, скажем, так до 3-х секунд, то было бы лучше, а то, часто, пока, после клика перейду с одного окна в другое, то подсветка исчезает.
Естественно, эта проблема возникает, когда при записи браузер используется в полноэкранном режиме, но я, например, обычно так и использую -
@xclsv
Спасибо за свой метод. Как раз пригоден из-за первого пункта для меня.
Так же, если вы хотите спрятать свой код, но не хотите, чтобы при компиляции он сработал, то можете заюзать заведомо невыполнимые условия. Например:
If 0>1 или while 0>1
А внутри запихнуть конструкцию, которую выполнять не нужно.Что касается невозможности использовать функцию из-за того, что случаи могут быть разными, то тут необходимо создавать переменные входные параметры, которые можно задавать перед началом функции. Я раньше делал так.
-
@olegtut said in Лайфхаки BAS:
@xclsv
Спасибо за свой метод. Как раз пригоден из-за первого пункта для меня.
Так же, если вы хотите спрятать свой код, но не хотите, чтобы при компиляции он сработал, то можете заюзать заведомо невыполнимые условия. Например:
If 0>1 или while 0>1
А внутри запихнуть конструкцию, которую выполнять не нужно.Что касается невозможности использовать функцию из-за того, что случаи могут быть разными, то тут необходимо создавать переменные входные параметры, которые можно задавать перед началом функции. Я раньше делал так.
if и while можно писать со значением просто
0, чтобы они не выполнялись. -
@olegtut
С точки зрения мат.логики, If 0 также правильно, как if 0>1.
Операции внутри оператора условия выполняются тогда и только тогда, когда выражение истинно. В данном случае 0 преобразуется к false, то есть не к истине, а любое другое значение преобразуется к true. Если внутри выражения нет операторов, то это всё равно выражение.
Но согласен с тем, что человеческой логике это противоречит =) -
@olegtut said in Лайфхаки BAS:
@fox
Да, но мне этот метод не особо нравится. Я же люблю прослеживать семантическую логику везде. Мне нравится именно читать код. Ведь читая такую конструкцию, получаешь: "Если ноль, то", а это математически меня запутает :DЭто так, но это плохой тон. Можно вообще писать код в стиле обсуфикатора и он будет работать. Только Вас уволят за это, если работаете в компании )
-
Думаю очень годный лайфхак:
Чтобы убрать весь звук со страниц из скриптов BAS нужно добавить в файл chrome_command_line.txt строку
--mute-audioupd: Пользователь @Mic предложил альтернативный вариант отключения звука
https://community.bablosoft.com/topic/11145/bas-палится/24upd2: Начиная с 24 версии BAS звук можно отключить в настройках профиля браузера
chrome://settings/content/soundтестовый скрипт: 1934.xml
-
@drprime said in Лайфхаки BAS:
Добавлю так же полезную штуку - прогрессбар.
progress_maximum(100) progress_value(10)Выглядит это так

К сожалению прогресс бар виден только во вкладке "результаты", которую видят далеко не все пользователи. По этому я решил сделать прогресс бар в логе:

Функция рисует прогресс бар из таблицы с двумя колонками без рамки
progressbar = function(val,max){ var res = parseInt(val * 1000 / max ) if(val == 0) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#F0FFF0"</td></tr></table>') if(val >= max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#32CD32"</td></tr></table>') if(val != 0 && val < max)log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#32CD32" width="' + res + '"></td><td bgcolor="#F0FFF0" ></td></tr></table>') }Думаю описывать, что такое val и max в этой функции излишне
:D
Использовать необходимо вместе с действием "Очистить лог", я специально не стал добавлять очистку лога в саму функцию, на случай если помимо прогресс бара нужно что то вывести в лог.
Так выглядит лог без чистки:

html код таблицы лежит в открытом виде, так что изменить длину, цвет, или добавить текст не составит труда. Если этот прогресс бар зайдёт, добавлю дополнительную функцию настройки внешнего вида.
Вот тестовый скрипт
Ещё вариант с установкой цвета:
progressbar = function(val,max,color){ var res = parseInt(val * 1000 / max ) if(val == 0) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#F0FFF0"</td></tr></table>') if(val >= max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + color + '"</td></tr></table>') if(val != 0 && val < max)log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + color + '" width="' + res + '"></td><td bgcolor="#F0FFF0" ></td></tr></table>') }Пример использования
progressbar(35,100,"#00BFFF")
С глобальными переменными (или объектом в глобальной переменной) можно установить прогресс бар на несколько потоков:

-
-
Section Rules
Pinned Locked LifeHacks -
Правила Раздела
Pinned Locked LifeHacks -
-