Tverd
я на mqtt делал
Я так понимаю там из коробки это?
Roman
А ещё если один процесс - ничего лишнего вроде redis или любых mq вовсе не нужно, pub/sub прекрасно работает через глобальные таблицы. А если больше процессов - по таймеру можно проверять shared memory и через неё pub/sub делать, тогда redis и прочие опять не нужны. Не нужны они, незачем зря время исполнения тратить.
Tverd
Кстати про шаред память не подумал, спасибо, можно попробовать
Snusmumriken
А что это? :3
B
Кто то занимается менторством? Наставничеством
B
Утречка
Snusmumriken
Хм. Утро только тогда, когда ты проснулся. У самого та же фигня. Оу-е! Обнимахи!
Tverd
А что это? :3
Фиг я правильно объясню, это еще с юниксов пошло (если я все правильно помню). Типа два процесса могут иметь общую память и друг с другом взаимодействовать через нее.
Snusmumriken
Мне казалось что это лёгкие потоки. Общая память в двух процессах может быть только если оба процесса исполняются на одном ЦП. И лёгкие потоки подходят под это дело: просто открываешь в таком потоке новую приложулю, и ось перключает проц между задачами.
Roman
В том то и фишка, что shared мемри это общая память для разных процессов, вот она для этого и придумана
Snusmumriken
Грубо говоря, ядру приложули поступает прерывание: "Переключись на эту задачу", а потом снова.
Snusmumriken
Скажи мне, как два процессора могут без дедлоков общаться с одним и тем же участком памяти?
Roman
не поток, а просто память, её выделяешь и потом пользуешься как хочешь
Snusmumriken
Представь, что два процессора абсолютно одновременно записывают в одну ячейку памяти разные данные. Что происходит?
Roman
конечно там все по-умному сделано, я не знаю как, догадываюсь, что процессоры в очередь становятся
Мерль
мьютексы, мьютексы повсюду
Snusmumriken
А как определяется доминирующий? Ведь одно приложение рассчитывает, что на этом участке будут одни данные, а другое - другие.
Мерль
мьютексы, мьютексы повсюду
и атомарные операции
Мерль
и lock free алгоритмы
Roman
опенрести, там абстракция (не текущая совсем) делает эту память простой и удобной
Snusmumriken
Насколько я знаю, эта shared memory не что иное как пайп. Грубо говоря, канал, в который можно записать текст. А другой процесс может только считать этот текст, копировать себе и что-то с этим сделать. Например, отправить обратно. Объекты в таких пайпах можно хранить только в сериализованном виде. А полностью общая память - что-то страшное.
Roman
только любой процесс может читать и писать
Snusmumriken
Ну, да. Но всё равно, там может быть только текст. Это типа unix way - использовать текст для связи приложений.
Мерль
Ну, да. Но всё равно, там может быть только текст. Это типа unix way - использовать текст для связи приложений.
Нет, там может быть что угодно Это вообще не имеет отношения к юниксовым пайпам
Snusmumriken
Ок, загуглю.
Roman
луа таблицу все таки там хранить нельзя
Мерль
Каналы - это другой способ межцпроцессного взаимодействия
Мерль
луа таблицу все таки там хранить нельзя
В луа в ообще нет доступа к таким штукам (в обычной luaVM)
Snusmumriken
Тут половина народу сидит на luajit, и имеет доступ к любым сишным библиотекам.
Мерль
В луа в ообще нет доступа к таким штукам (в обычной luaVM)
Хотя можно отрыть именованй канал Наверное Не пробовал
Snusmumriken
Это уже не shared memory.
Мерль
Каналы - это другой способ межцпроцессного взаимодействия
Мерль
Господа, не надо гуглить
Мерль
Нужно взять и прочитать Linux System Programming
Мерль
Один раз
Мерль
всё
Snusmumriken
Если бы я ещё писал на линукс системные штуки.
Мерль
Если бы я ещё писал на линукс системные штуки.
Это нужно, для того, чтобы не путать именованые каналы, разделяемую память и пайпы хотя бы
Snusmumriken
Ну, технологически ты прав, но практически - лично у меня на это нет времени и объективной необходимости, поэтому гугл, если встретился с неизведанным.
Доброе утро всем.
Андрей
Добрый вечер.
Snusmumriken
Утречко.
Андрей
Камчатка?
Snusmumriken
Мироощущение.
Андрей
Хех.
Snusmumriken
На Камчатке сейчас кстати довольно ранняя ночь.
Андрей
Ну, я уж не стал предлагать вариант "США".
Snusmumriken
У венды есть очень забавная визуализация дневного цикла.
B
или просто кто чепочем растолкует типа дэбил, ничерта не знаешь, это изучай, не понял повторить пока не поймешь, тут удели особое внимание, тут посмотри там почитай и тд
꧁Александр
Доброго времени суток, посоветуйте докладчиков по Lua на DevConf'17 https://devconf.ru/ru/offers
Yuriy
всем доброго времени суток Такой вопрос Есть таблица local settings= { name="foo", surname="fam" } Есть текст (многолайновая строка) Которая содержит в себе несколько полей name={settings.name} surname={settings.surname} При парсинге я получаю строки settings.name и settings.surname Хочу заменить их на реальные значения таблицы Пытаюст это сделать через loadstring(str) Где str="settings.name" например что-то типа "name="..loadstring(str) Lua ругается. [string "settings.name"]:1: '=' expected near '<eof>' Как я понимаю loadstring от меня ждет не имени переменной а полноценного выражения. Собственно вопрос. Как получить именно имя переменной?
mva
предлагаю вместо изобретения колеса использовать готовый темплейтер
Yuriy
Например?
Yuriy
Хотя нагуглить то я нагуглю. Ну просто если темплейтеры это делают, хочется понимать как
Alexey
Доброго времени суток, посоветуйте докладчиков по Lua на DevConf'17 https://devconf.ru/ru/offers
у вас 404 на https://devconf.ru/content/files/pdf/obrazets-pisma-prosby-vashemu-rukovoditelyu-devconf.pdf
Anonymous
Мне немного не понятен твой пример, что ты в последнем шаге хочешь с loadstring. Вот насколько я понял, на Lua5.3 (lua demo): settings ={} settings.name="!@#$" settings.surname = "my fam!" load("print(settings.surname)")() --или заморочиться так: var = load("return settings.surname")() print( var ) Но то же самое и с gsub, работая со строкой проделать можно
Roman
хей, eval == evil
Yuriy
Как ты правильно увидел я делю некий шаблонизатор Тектс хранит шаблоны ("settings.surname") Шаблон по сути это адрес переменной в которой лежит необходимое значение Вот это значение я и хочу достать То есть на вход подается шаблон - текст с чанками и таблица, содержащая значения этих чанков На выходе должен получиться текст в которм чанки заменены реальными значениями
Anonymous
Потому и string.gsub!
Yuriy
ну да... Я понимаю Я ею и делаю вот таким образом примерно local line=string.gsub(str,'%{.+%}',loadstring("settings.surname")) толкьо инетрпретатор ругается как раз ошибкой которрую я запостил выше
Anonymous
Да, потому что в лоадстринге у тебя не законченный кусок кода. относись к нему как к файлу. Поэтому я во втором примере добавил "return settings.surname"
Anonymous
а да, и loadstring запустить надо () но блин, всё ещё несведомая ЛУтАющая тарелка получается.
Anonymous
Случайно кнопку зажал, не обращайте внимания...
Yuriy
Тем не менее local settings={name="foo"} local code="settings.name" local line=string.gsub(str,'%{.+%}',loadstring("return "..code)()) lua: [string "return settings.name"]:1: attempt to index global 'settings' (a nil value)
Anonymous
Да, доступа к локальным переменным нет по-моему.
Yuriy
то есть таким способом яне достучусь до необходимо мне таблицы как я понимаю...
Yuriy
потому что значение возвращается из строки, которая не видит перемееных в данном файле...
Anonymous
Нет. Только самому распарсивать эти ваши %username% и подставлять
Yuriy
Да распарсить то оно распарсивается.
Anonymous
либо пробрасывать таблицу в окружение loadstring. (sandbox из 5.1)
Yuriy
библиотека templet сделал все за меня. Но спасибо в любом случае за разъяснение.
Anonymous
Я синтаксис string.gsub подсмотрел, всё очевидно, Ватсон (такого не делал просто :) ): textchunk = "And thus God spoke to settings.name and told him to settings.action" settings = {} settings.name = "spy" settings.action = "respond" print(string.gsub(textchunk, "settings%.([%w%d]+)", settings)) То есть он захватывает вторую часть от settings.(name/action) и подставляет ключ в таблицу: settings["name"] и settings["action"] Если ключ не найден, подмены не происходит
Yuriy
хм.. Спасибо добр человек Если что я через templet сделал уже Получилось что то вроде этого local templet = require("templet") local str=[[name=${settings[1].name} surname=${settings[2].surname}]] local template=templet.loadstring(str) local settings={{name="foo"},{surname="fam"}} local newSettings={settings=settings} print(template(newSettings))
Yuriy
Всем привет! Еще вопрос по поводу чанков Из предыдущего разговора gsub если ему подставить таблицу будет пробегатьпо каждому ключу И если название ключа матчится выражению то строка заменяется значением ключа То есть loca myTable={name="vasya"} local str="name={name}" print(string.gsub(str,"{(%w+)}",myTable) Вывод будет name=vasya подсткажите пжлст по поводу вложенности. Пример у еня есть таблица local myTable={persons={{name="vasya"},{name="petya"}}} соответсвенно лежат они как myTable.persons[i].name но local str="name={persons[1].name}" print(string.gsub(str,"{(%w+)}",myTable)) В данном случае ничего не сделает как я понимаю gsub пробегает толкьо по первому ключу То есть во вложенные таблицы gsub не смотрит Какие ест ьварианты проблежаться по вложенностям? мб кто реализовывал?
Snusmumriken
Пихаешь в gsub функцию, которая пробегает по ключам как тебе нужно.
Snusmumriken
Допустим, примерно так: local function uuid() local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' return template:gsub('[xy]', function (c) local v = (c == 'x') and random(0, 0xf) or random(8, 0xb) return ('%x'):format(v) end) end Тут функция, которая принимает и возвращает переработанный символ.
Snusmumriken
Вот даже картинкой, чтобы читалось.
Snusmumriken
Только вместо преобразования буквы в шестнадцатиричку, функция может произвольно пробегать по ключам таблички, и делать вообще любую ересь, хоть открывать веб-сервер с эвент-лупом, возвращая из функции строку, в которой все слова "Хой" заменены на что-нибудь принятое от клиента.