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 - использовать текст для связи приложений.
Мерль
Snusmumriken
Ок, загуглю.
Roman
луа таблицу все таки там хранить нельзя
Мерль
Каналы - это другой способ межцпроцессного взаимодействия
Snusmumriken
Тут половина народу сидит на luajit, и имеет доступ к любым сишным библиотекам.
Мерль
Snusmumriken
Это уже не shared memory.
Мерль
Каналы - это другой способ межцпроцессного взаимодействия
Мерль
Господа, не надо гуглить
Мерль
Нужно взять и прочитать Linux System Programming
Мерль
Один раз
Мерль
всё
Snusmumriken
Если бы я ещё писал на линукс системные штуки.
Snusmumriken
Ну, технологически ты прав, но практически - лично у меня на это нет времени и объективной необходимости, поэтому гугл, если встретился с неизведанным.
ㅤ
Доброе утро всем.
Андрей
Добрый вечер.
Snusmumriken
Утречко.
Андрей
Камчатка?
Snusmumriken
Мироощущение.
Андрей
Хех.
Snusmumriken
На Камчатке сейчас кстати довольно ранняя ночь.
Андрей
Ну, я уж не стал предлагать вариант "США".
Snusmumriken
У венды есть очень забавная визуализация дневного цикла.
B
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
Хотя нагуглить то я нагуглю. Ну просто если темплейтеры это делают, хочется понимать как
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
Только вместо преобразования буквы в шестнадцатиричку, функция может произвольно пробегать по ключам таблички, и делать вообще любую ересь, хоть открывать веб-сервер с эвент-лупом, возвращая из функции строку, в которой все слова "Хой" заменены на что-нибудь принятое от клиента.