Stanislav
Конкретно в этом проекте возможно обойтись и без Json, но конечная цель-научиться парсить json в принципе, чтобы работать с ним и в других проектах.
Так это и есть лайтовый парсинг жсона Конкретно этот вариант заточен на случай «прилетает большой жсон но нужны только несколько переменных» т.к. единственный минус в нужде обходить строку столько раз сколько у тебя переменных требуется забрать Его не сложно оптимизировать если ты заранее знаешь порядок переменных и тогда тебе надо искать первую с начала строки, а вторую уже с индекса положения конца данных первой и тд - т.е. ты пропустишь бОльшую часть работы У меня так работает все нагруженное много лет 👌 Плюсов два - скорость и отказоустойчивость (если появляются спец символы типа переносов или любой мусор не попавший в поле данных то поиск вместо четких индексов по сути автоматизирует проверку, если жсон не полный прилетел - можно обработать все что пришло, смена порядка не ломает алгоритм а только снижает его скорость - придется обойти строку целиком если переменной не оказалось в нужном месте) Минус - некоторая обезьянья работа при изменении содержимого жсона
Kot
Это из учебника физики инфа?
Да.как и переменые с функциями тоже из учебников .
Sevan
Привет! Есть одна проблема, после включения блока питания есп32 при первом включении уходит в какое то зависание, а если выключить включить бп, то начинает работать как надо. Может есть идеи в чем дело?
Ruslan
Это из учебника физики инфа?
Он даже не понял твоего сарказма )
Max
Включаем функции сбора статистики в ESP32-arduino При использовании arduino framework в Platformio, а также в Arduino IDE нет возможности конфигурирования esp32 arduino core, больша́я часть функций по умолчанию отключена, а для изменения конфигурации предлагается вручную пересобирать SDK. Давайте пройдем этот квест. Речь пойдет о функциях FreeRTOS vTaskGetRunTimeStats / vTaskList, но таким же образом можно изменить и другие опции sdkconfig. Читать далее https://habr.com/ru/articles/878692/?utm_campaign=878692&utm_source=habrahabr&utm_medium=rss
ok-home
я правильно понимаю: сейчас сигнал от плюса к минусу, при инверсии от минуса к плюсу должен быть?
истину глаголешь. нолик станет единичкой и наоборот, ну чтобы еще проще выходной сигнал пойдет через инвертор
Kot
Он даже не понял твоего сарказма )
Думаю понял. Просто ух режет от "сигнал течёт от минуса к плюсу " У кодеров тоже есть общепринятые термины.
ㅤ
Не особо надежно и медленно. Регекспы уж тогда
Либу регэкспов на есп32 затащить это гениальное решение, да. Как раз выцепиь обычным strstr будет в разы быстрее и экономнее по памяти
Mezzo Lab
Да.как и переменые с функциями тоже из учебников .
В школьной физике ток течёт в одну сторону, в последующих учебниках - в другую🤡
Stanislav
Не особо надежно и медленно. Регекспы уж тогда
1) это максимально быстро (с учетом порядка переменных) - быстрее не сделать физически 2) это максимально надежно потому что а) надежно (ессно тебе надо предусмотреть обход в случае сбоя порядка) б) это наглядно и понятно Крутить регэкспы чтоб найти заведомо известную подстроку .. ну такое себе - собсно а зачем?
ㅤ
Есть re2c же, ну. И ragel никуда не делся.
Это все не нужно если ему надо прочитать пару значений. Накера тащить всякие фреймворки? Что за зумерский подход чтоб написать сраный hello world надо тащить какой нибудь react и прочее ?
Kot
В школьной физике ток течёт в одну сторону, в последующих учебниках - в другую🤡
По этому стоит мне поставить смайл клоуна. Я понял 😁🤝.. В другую сторону это когда влево вниз и до упора? Я понял.
Kot
Хорошо. Тогда сигнал потёк с минуса в плюс 😁
ㅤ
Фреймвоки? Это кодогенераторы.
Тфу не VUE, я jquery имел ввиду
TR
За один проход на все переменные? Научи 🤓
Погуглите про регекспы сами. Но желательно для начала хотя бы иметь представление о конечных автоматах
Stanislav
Погуглите про регекспы сами. Но желательно для начала хотя бы иметь представление о конечных автоматах
Не не, мне нужен алгоритм на пальцах Я выше расписал как за один проход пройти строку одну раз сразу забрав все нужные переменные в нужные места без дублирования в памяти и с устойчивостью к мусору, зная порядок переменных в жсоне. Не зная порядок делается так же но с дублированием во временный 2д массив Расскажите как регэкспом сделать быстрее и сразу раскидать в нужное, пожалуйста 🙏🙄
Mezzo Lab
Хорошо. Тогда сигнал потёк с минуса в плюс 😁
Ток потёк от плюса в минус. От минуса к плюсу. А что там у тебя течёт, мне неведомо
Kot
Ток потёк от плюса в минус. От минуса к плюсу. А что там у тебя течёт, мне неведомо
Ааа... Ток проинвестировали включив в меню ... Я понял. Надо же...
Kot
Ток потёк от плюса в минус. От минуса к плюсу. А что там у тебя течёт, мне неведомо
Осталось тогда разобраться, чем отличается втекающий ток, от вытекающего.
Mezzo Lab
Ааа... Ток проинвестировали включив в меню ... Я понял. Надо же...
Сигнал идёт от входа к выходу. Не будем про отражения и тд
Mezzo Lab
Kot
Ну давай контекст, вот только в помойке болталке
В надо? Мне столько ещё учится нужно. Вот например про земляные петли . Если знаешь, научи.
ㅤ
В болталку переместитесь
Kot
Сигнал идёт от входа к выходу. Не будем про отражения и тд
Почему клоунов перестал ставить? Мне они нравились...
Stanislav
ковыряй ragel -C -G2
Зачем? Что хотя бы теоретически может быть быстрее однократного обхода по частям? (Это риторический вопрос ибо ничего 🤷🏻‍♂️😁)
Stanislav
оптимизированный конечный автомат ну или Intel Hyperscan (SSE) если у тебя x86
Пожалуйста, пример последовательности его действий на пальцах 🙏
Dmitry
Пожалуйста, пример последовательности его действий на пальцах 🙏
конечный автомат изучают на второй лекции информатики (сразу после машины Тьюринга, или вместо если курс/препод предпочитает практические знания) простой рабочий код см. на два сообщения выше
S
Привет всем! А подскажите, как обойти триал Visual Micro Arduino IDE for Visual Studio? )
S
последнюю версию. Хотя уже нашел за 2023й год плагин
Dmitry
Вместо тысячи слов - просто алгоритм по шагам Пожалуйста 🙏😁
документация у рагеля фиговая — синтаксис птичий, и при этом нет толковых примеров с разбором, придется гуглить, и продираться через примеры чужих исходников находить простые примеры на гитхабе, и по кусочкам разбирать
Stanislav
документация у рагеля фиговая — синтаксис птичий, и при этом нет толковых примеров с разбором, придется гуглить, и продираться через примеры чужих исходников находить простые примеры на гитхабе, и по кусочкам разбирать
Речь не о документации, речь о самом алгоритме Как только он тут появится текстом сразу придет понимание что для плоского жсона он не может быть быстрее чем последовательное сравнение массивов с именами переменных с массивом строки жсона просто потому что в любом общем случае любому алгоритму придется сравнить всю строку (ну ок, за исключением стартовой/финишной скобок [] если нас не интересует факт того что пачка целиковая 😁) либо со всеми именами либо пройти всю строку в поисках последовательностей начала объявления имен и значений и выдергивания их для последующего … ага, сравнения Более того, для случаев когда нас интересуют не все переменные, оптимизация последовательного сравнения лежит на поверхности: - при совпадении первого символа надо проверять что символ : (сразу убедишься что длина совпадает и это именно пара имя-значение) находится по индексу первого_символа(«)+длина_имени_переменной+2 - если да то проверяем имя если нет то пропускаем как минимум 8 итераций полностью и едем дальше. Ессно работает только при условии что длина искомой переменной меньше чем длина самого короткого возможного имени+8 (надо перепроверить, насколько помню в жсоне минимальная последовательность «А»:«»,«) символов - иначе можно пропустить полную пару имя-значение и нарваться на данные из другой переменной - надо собрать статистику имен переменных и если они, например, начинаются с одинакового префикса то соотв его пропускать, и прикинуть процент отличий символов по расположению - т.е. если у тебя переменные chan1, chan2, chan3 то тебе логично проверять индекс +4 при нахождении символа с в жсоне И тд и тп Но это все требует заранее определенной информации об именах переменных - того что ни одна библиотека «общего случая» за тебя не сделает Это все очень наглядно и просто расписывается алгоритмом на бумажке буквально в несколько строк Без апелляций к курсу информатики, библиотекам и прочему И да, для разной иерархии данных в жсоне нужны разные оптимизации - как только мы уходим из плоскости в дерево у нас меняется подход если мы рассматриваем вариант того что нам нужно не все из прилетевшего жсона (тогда нам желательно сразу знать все имена искомых переменных и их возможную глубину нахождения для пропуска лишних веток если нужное не может быть дальше N уровня и тп) Короче жсон - с одной стороны отличный полигон для велосипедостроения и может быть заточен на довольно высокие скорости обработки, а с другой стороны для микроконтроллеров … несколько избыточен в большинстве случаев 😁 ибо всегда проиграет по скорости и потреблению памяти даже не самому внятному бинарному протоколу 🤷🏻‍♂️😁
Dmitry
ясно, поциент библиотеку от генератора кода не способен отличить
Max
Речь не о документации, речь о самом алгоритме Как только он тут появится текстом сразу придет понимание что для плоского жсона он не может быть быстрее чем последовательное сравнение массивов с именами переменных с массивом строки жсона просто потому что в любом общем случае любому алгоритму придется сравнить всю строку (ну ок, за исключением стартовой/финишной скобок [] если нас не интересует факт того что пачка целиковая 😁) либо со всеми именами либо пройти всю строку в поисках последовательностей начала объявления имен и значений и выдергивания их для последующего … ага, сравнения Более того, для случаев когда нас интересуют не все переменные, оптимизация последовательного сравнения лежит на поверхности: - при совпадении первого символа надо проверять что символ : (сразу убедишься что длина совпадает и это именно пара имя-значение) находится по индексу первого_символа(«)+длина_имени_переменной+2 - если да то проверяем имя если нет то пропускаем как минимум 8 итераций полностью и едем дальше. Ессно работает только при условии что длина искомой переменной меньше чем длина самого короткого возможного имени+8 (надо перепроверить, насколько помню в жсоне минимальная последовательность «А»:«»,«) символов - иначе можно пропустить полную пару имя-значение и нарваться на данные из другой переменной - надо собрать статистику имен переменных и если они, например, начинаются с одинакового префикса то соотв его пропускать, и прикинуть процент отличий символов по расположению - т.е. если у тебя переменные chan1, chan2, chan3 то тебе логично проверять индекс +4 при нахождении символа с в жсоне И тд и тп Но это все требует заранее определенной информации об именах переменных - того что ни одна библиотека «общего случая» за тебя не сделает Это все очень наглядно и просто расписывается алгоритмом на бумажке буквально в несколько строк Без апелляций к курсу информатики, библиотекам и прочему И да, для разной иерархии данных в жсоне нужны разные оптимизации - как только мы уходим из плоскости в дерево у нас меняется подход если мы рассматриваем вариант того что нам нужно не все из прилетевшего жсона (тогда нам желательно сразу знать все имена искомых переменных и их возможную глубину нахождения для пропуска лишних веток если нужное не может быть дальше N уровня и тп) Короче жсон - с одной стороны отличный полигон для велосипедостроения и может быть заточен на довольно высокие скорости обработки, а с другой стороны для микроконтроллеров … несколько избыточен в большинстве случаев 😁 ибо всегда проиграет по скорости и потреблению памяти даже не самому внятному бинарному протоколу 🤷🏻‍♂️😁
Это утверждение справедливо для вэбни. В эмбиде велосипедостроением считается создание своих бинарных, ни с чем не совместимых протоколов.
Max
Небинарные тоже фу, если что.
Stanislav
Dmitry
Третий раз попрошу пошаговый пример 🙏🤣
- скачать ragel - прочитать документацию - написать парсер под конкретный формат пакета - получить .cpp код - прочитать код (погоняв пошагово в отладчике) * задача со звёздочкой: прогнать код в профайлере, сравнивая тайминги и аллокации памяти со свой помойкой на строковых функциях ** заставить коллегу поправить твой код под новый формат пакета (и узнать о себе много нового)
Maxx
существующих алгоритмов поиска подстроки в строке — как у дурака фантиков. у каждого свои плюсы и минусы
Tonchik
У вас там гигабиты входящего трафика на ESP будут разбираться?
ㅤ
У вас там гигабиты входящего трафика на ESP будут разбираться?
С языка снял, только собирался спросить о каком трафике идет речь. Что еще ниче не сделано а уже обсуждают какие-то алгоритмы которые быстрее
Maxx
обычная преждевременная оптимизация. может нравится людям задрачиваться =)
Dmitry
существующих алгоритмов поиска подстроки в строке — как у дурака фантиков. у каждого свои плюсы и минусы
вопрос не в алгоритме, а в простоте поддержки кода — чтобы потом коллега или какой-то сторонний человек мог скачать с гитхаба код, и поправить под себя (типа получения данных с электросчётчиков — там каждая следующая модель одного производителя формат пакетов меняет) что проще понять и поправить — BNF/регулярки, или три страницы ручного кода с выделением памяти под промежуточные данные и ijk переменными?
ㅤ
обычная преждевременная оптимизация. может нравится людям задрачиваться =)
Я сразу вспомнил того чела который esp32s3 в руки взял. Но уже собрался писать на регистрах, гонять какие-то сотни мегабайт трафика. Флешка нужна быстрая.
ok-home
Я сразу вспомнил того чела который esp32s3 в руки взял. Но уже собрался писать на регистрах, гонять какие-то сотни мегабайт трафика. Флешка нужна быстрая.
Не мешай студенту наступать на грабли, в отличии от других человек тянется за знаниями и получает их с нашей или без нашей помощи ))
Maxx
Ок, я сдаюсь, более шустрого алгоритма чем последовательное сравнение мы так и не дождались 🤣
вот тебе ещё: https://www.researchgate.net/publication/220693416_Handbook_of_Exact_String_Matching_Algorithms
Stanislav
существующих алгоритмов поиска подстроки в строке — как у дурака фантиков. у каждого свои плюсы и минусы
Конкретную функцию сравнения можно оптимизировать, но я не про нее конкретно Я про алгоритм: - берём строку жсона - ищем в ней последовательность «имя_первой_переменной»:« - с найденного индекса+длина_имени+3 ищем положение символа « (в идеале проверяем что он не экранирован 🤣) - профит, вы нашли положение поля данных - ищем последовательность «имя_второй_переменной»:« начиная с индекса конца данных первой переменной - если мы забираем все переменные то мы найдем ее сразу - если не нашли то возможны два варианта - пачка не содержит этой пары, либо последовательность нарушена - если второе возможно то надо пробежать жсон с нуля до первой попытки поиска Для 1д: - проще некуда (ну реально же три строчки) - быстрее почти некуда (только оптимизация именно функции поиска/сравнения) - не требует ничего кроме функции поиска в строке, но ее легко заменить на сравнение массивов - т.е. работает везде и не требует доп памяти - поддерживать/разобраться может любой школьник (3 строки 😁) - гарантированно совместимо со всем что похоже на жсон даже если оно помято жизнью
Stanislav
обычная преждевременная оптимизация. может нравится людям задрачиваться =)
Толь дело для поиска значения в строке завести полновесную жсон либу и обмазать ее регэкспами чтоб потом спрашивать «а чо я ей загоняю валидный жсон а оно мне нан выдает - это же было так просто» 😁
Tonchik
такие вы прикольные, а потом кто-то поменяет формат влетающего сообщения "ну там же ЖСОН" и вуаля... девайс ушел в ребут. Возьмите старую проверенную либу и не мучайтесь))))
Tonchik
Time to market ценнее. КМК, я вон вчера копи-пастом накопипастил калибровку MH-Z19 за минут 40 еще час на отладку, и, думаю, теперь хана: я вряд ли это на универсальное перепишу))
Dmitry
Конкретную функцию сравнения можно оптимизировать, но я не про нее конкретно Я про алгоритм: - берём строку жсона - ищем в ней последовательность «имя_первой_переменной»:« - с найденного индекса+длина_имени+3 ищем положение символа « (в идеале проверяем что он не экранирован 🤣) - профит, вы нашли положение поля данных - ищем последовательность «имя_второй_переменной»:« начиная с индекса конца данных первой переменной - если мы забираем все переменные то мы найдем ее сразу - если не нашли то возможны два варианта - пачка не содержит этой пары, либо последовательность нарушена - если второе возможно то надо пробежать жсон с нуля до первой попытки поиска Для 1д: - проще некуда (ну реально же три строчки) - быстрее почти некуда (только оптимизация именно функции поиска/сравнения) - не требует ничего кроме функции поиска в строке, но ее легко заменить на сравнение массивов - т.е. работает везде и не требует доп памяти - поддерживать/разобраться может любой школьник (3 строки 😁) - гарантированно совместимо со всем что похоже на жсон даже если оно помято жизнью
достаточно найти "x открывающую кавычку и первую букву, потом сразу одной машинной командой делаем p += namesize(var)+2 и получаем начало поля после двоеточия, при этом нет потерь на повторный вызов strstr и аллокации на стеке в описании грамматики это будет выглядеть как пустое правило \s\"x.{7}:
S
Он же не торрентах валяется
Если можно поделись ссылкой. Спасибо заранее. Поставил ломаный после триаловского, все равно пишет, что лицензия в марте закончится.
ㅤ
Если можно поделись ссылкой. Спасибо заранее. Поставил ломаный после триаловского, все равно пишет, что лицензия в марте закончится.
Я против распространения пиратского контента, поэтому как нибудь самостоятельно. Я в этом стараюсь не помоггать
Max
Time to market ценнее. КМК, я вон вчера копи-пастом накопипастил калибровку MH-Z19 за минут 40 еще час на отладку, и, думаю, теперь хана: я вряд ли это на универсальное перепишу))
Я бы почти согласился, если бы этот концьепт не двигали всякие поскакушные менеджеры, которым надо всё и прям позавчера, а потом оказывается, что не очень-то и надо, и, вообще, они уже уволились и теперь им надовчера где-то еще.