Страница 2 из 13

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

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

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

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


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

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

Добавлено: 29 июл 2022, 07:28
pepelxl
Brook писал(а): 27 июл 2022, 20:06 .

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

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

Добавлено: 29 июл 2022, 14:30
Brook
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"

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

Добавлено: 29 июл 2022, 18:55
Brook
В процессе тестирования этого метода, открыл для себя еще одну возможность. Век живи - век учись.

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

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

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

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

Добавлено: 29 июл 2022, 20:00
Brook
Еще в копилку про размер скриптов и файлов.

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

Изображение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 04 авг 2022, 18:08
Brook
Еще немного про массивы.

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

Массив не стоит копировать обычным "присваиванием", типа такого :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 [ ], то его элементы останутся в первом.

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

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