Телеграмма для Mikrotik...

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Да, я читал этот пост. Там сохраняется в поле Regexp, но речь только о переменных.
Кстати, массив хранится в переменной не так, как объявляется.
Да, массив хранится в виде строки, но при восстановлении разворачивается снова в массив
Многомерные массивы не пробовал

Писать надо в файл. Там таких ограничений нет.
Но часто писать в файл вредно для flash-памяти роутера

Кстати, хочу поделиться одним наблюдением. Как известно, ограничение на длину переменной в
Микротик 4096 байт. Но на глобальные переменные, это ограничение не действует.
За это наблюдение спасибо ! Но это в принципе очевидно, ведь функции, объявляемые как глобальные переменные, могут иметь весьма длинный код, вот разрабы Микротиковцы и сняли ограничение на длину для глобальных ...


Да, нужен сайт для Вашего проекта по боту для Телеграмм. Надо кинуть клич, наверняка ведь, тут на форуме есть web-дизайнеры и программисты пишущие сайты ... Может podarok66 поможет ? Он, как модератор, знает подноготную многих пользователей форума.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

Brook писал(а): 27 июл 2022, 20:06 .

UPD:
Писать надо в файл. Там таких ограничений нет.
Они есть но другие, примерно 64 Кб. получилось сохранить в один файл из массива.
А если сохранять скрипты командой Export в один файл, то ограничений по размеру не увидел.
Вот так можно писать файлы любой длинны. Естественно лучше это делать на подключённую флешку. viewtopic.php?f=14&t=13440&p=83960#p83960


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

pepelxl писал(а): 29 июл 2022, 07:28 Вот так можно писать файлы любой длинны. Естественно лучше это делать на подключённую флешку. viewtopic.php?f=14&t=13440&p=83960#p83960
Отличный метод, спасибо за информацию. Протестировал сейчас на 150 000 записей. Всё сохранилось. Однозначно буду использовать.

Код: Выделить всё

:local test ":global testArray [:toarray \"\"]; :for key from=0 to=150000 do={:set (\$testArray->\$key) [:tostr (\"str=\".\$key)]}; :put (\$testArray) "; execute script=$test file="array.txt"


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

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

Он хорош еще и тем, что команда :execute запускает выполнение кода в отельном процессе и не ждет возврата, как это происходит с функциями и командой :parse.

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

Спасибо еще раз Ув. pepelxl!


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Еще в копилку про размер скриптов и файлов.

Ув. pepelxl уже писал, что на скрипт приходится примерно 40Кб и больше туда не запихнешь, как и в Regexp. Так и есть.
Но можно разворачивать функции и скрипты прямо из файла, командой import. А в файл можно записать очень много кода.

Изображение


pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

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


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

pepelxl писал(а): 29 июл 2022, 21:19 Напомню, может ещё вы не сталкивались., Советую разобраться в вариантах объявления и инициализации массивов, есть нюансы. А так же итерации по многомерным массивам, и когда они начинают рассыпаться в указатели и теряться. Я с этим столкнулся когда уже была написана основная часть кода и потерял около месяца, при вылавливании блох. Темы эти несколько раз поднимались на форуме.
С массивами пришлось столкнуться очень плотно. В том числе учитывая и ту информацию, о которой Вы говорите. Она помогла не наступить на те же грабли, за что отдельная благодарность сообществу.

О массивах тоже можно долго говорить.По сути это единственная структура данных доступная в Микротик скрипт. Но благодаря многомерности из него можно построить и другие структуры.

Одномерный индексированный - это несортированный список.
Одномерный k=v - это сортированный по ключу список.
Двумерный - это hashTable
Многомерный - это сортированное дерево.

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


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Brook писал(а): 29 июл 2022, 18:55
Если запускать функцию командой :execute, то код после нее будет продолжать выполняться, а не ждать, когда эта функция отработает. Этот факт открывает путь к многопоточности.

Спасибо еще раз Ув. pepelxl!
А теперь ещё и многопоточность! Уже протестировал вариант с execute. Время реакции на нажатие кнопки сократилась в разы.

До этого, при использовании команды :parse, было:

3 секунды, если отправлять ответ на нажатие.
2 секунды, если не отправлять.

Теперь это одна секунда в любом варианте.


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Еще немного про массивы.

Многие в курсе, но и многие не знают...

Массив не стоит копировать обычным "присваиванием", типа такого :local array1 $array2, т.к. он передается по ссылке.
Если после такого "присваивания" менять значения элементов первого массива, то они изменятся и во втором, т.к. первый массив содержит ссылку на второй.

Ниже пример такого поведения.

Код: Выделить всё

:local  array1 "empty"
:local  array2 [:toarray "4,5,6"]
:put "-----------"

:put $array1; 
:put $array2

:set array1 $array2
:set ($array1->0) 10

:put "-----------"

:put $array1; 
:put $array2

Код: Выделить всё

Вывод в консоль

-----------
empty
4;5;6
-----------
10;5;6
10;5;6
Но, если после таких манипуляций обнулить второй массив :set array2 [ ], то его элементы останутся в первом.


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Спасибо, интересно и нужно. А если обнулить первый массив что будет ? :-):


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить