Leon174
Я как-то заехал в этот район, обычно по другой улице по краю езжу, а тут заехал прям в эпицентр. Я охренел. Это гетто самое натуральное, только еще не очень заселенное. Там света белого не видно, дома-то некоторые под 30 этажей. Зачем!?? Ну и планировка эта... "Тут птицы не поют, деревья не растут", едрить их через коромысло.
Бгг... Ну, хоть так, чо. Хотя принципиально ничего не поменялось. Все так же перегруженный людьми район, который неведомо как разъезжается, что на личном транспорте, что на джамшутках. Там и до этого района был перегруз транспорта, что за ад сейчас даже представлять не хочу.
https://www.youtube.com/watch?v=nxjWQksZWyg
кота
Ух, триггернуло. Купили мы, значит, квартиру в ЖК на котловане. С самим ЖК вроде не прогадали, рядом с центром, но не в центре, проект уютный, и по центру двора внушительная площадка-парк, размером с центральный парк в моем родном городе, и дома не дают тень во дворе разве что в полдень. Застройщик крутой, плюс еще старается, потому, что сдает пока только первые 3 дома из 9, нужно товарный вид поддерживать. Но вот первые дома стали подходить к сдаче, обустроили двор, прилежащие территории, застелили все газонами. Со стороны улицы тоже дорожки-газоны. И вот наступила суббота. Работяги отдыхают, кирпичи с неба не падают, так что сторож расслабился(ну или из промо-соображений сказали не гонять), и из соседних и не очень домов стали собираться зеваки. Свиноматки по газону, который не оправился от транспортировки, не говоря уж о том, чтобы прижиться, разложились в рядок, и вдоль этого рядка свинодетки побежали делать сальтуху. Во дворе играют дети разных возрастов, зона барбекю уже опробована и обмыта, а балки, между которыми натянута тарзанка, пошли трещинами(и какого черта они из дерева? Не так часто советские практики бывают настолько уместны и удачны, и тут вдруг их не применяют). А огражден двор шлагбаумом безо всяких намеков на ворота в перспективе, то есть, после релиза ситуация только усугубится. В сторожевой будке, конечно, появится человек, но ему же не проверять каждого пешехода, который под этим шлагбаумом полезет, чтобы срезать дорогу. Да и «лицевой» газон в любом случае в открытом доступе, и прижиться ему явно не дадут
квартиру...
кота
у меня сразу флешбеки
кота
аннлн
>:3
аннлн
IT'S A LION!
fgntfg
У меня новый телефон, кто это?
fgntfg
Так, дело за малым, надо вспомнить пароль от 4pda
кота
надо было ставить кипасс
кота
кота
А лучше 1password
fgntfg
Не, я пароль помню, в логине я не уверен
кота
fgntfg
Эт у меня в браузере такое
кота
Единственный минус если ключ проебал то можно делать бочку
кота
По этому лучше использовать 1password
кота
Чем он лучше Keepass?
Тем, что всё онлайн и тем, что не завалил ни одного аудита огоспаде все твои пароли на сервере у дяди какой полуумный на такое подпишется (я например)
Leon174
Ясно, остаюсь на кипасе.
кота
кота
На флешечке?
кота
А бд?
Leon174
Дубли есть, конечно. Или что бд/ключ?
кота
Не мог пиццу даже заказать
кота
Хорошо хоть немного нала было
fgntfg
Максимально ебано
Leon174
fgntfg
У меня физически карты с собой всегдв
Nikolai
ставь plys если узнал себя
кота
Кто-то использовал терминальный эмулятор алакритти?
кота
Проблемы возникали? Если да, то какие
fgntfg
fgntfg
Nikolai
Блен, кажется, я чего-то не понимаю, разве, если по сокету ничего нет, процесс не должен спать?
B
немного музыки
B
B
B
B
fgntfg
https://music.yandex.ru/album/10679975/track/45517687
Nikolai
Если ты используешь select с некоторым минимальным таймаутом — должен спать.
Но не исключено что ядро проца на пределах своей мощности проверяет, не написали ли чего в сокет.
У тебя ведь неблокирующая фигня?
Да вроде уже разобрался, 25 лет лоб, а никак не привыкну, что надо давать себе на разобраться чуть больше 5 минут. Просто всегда казалось, что receive должен быть блокирующим. Но раз я уже приполз с вопросами, не подскажешь, я тут не делаю никакой херни из за которой память течь будет?
local socket = require("socket")
local server = assert(socket.bind("*", 51515))
local tcp = assert(socket.tcp())
server:settimeout(0.1)
local clients = {}
function checkClients()
local newclient = server:accept()
if not newclient then return end
table.insert(clients,newclient)
end
while true do
checkClients()
for i, client in pairs(clients) do
local resp = client:receive()
if not resp then
table.remove(clients, i)
client:close()
else
print(resp)
client:send("ok\n")
end
end
end
Nikolai
Ну, не считая того, что я одного клиента за тик принимаю, это я сделал осознанно, пытаюсь завести сервер на роутере))))
Snusmumriken
Кек, тут есть ещё один прекол, что твой сервер может обрабатывать только одного клиента единовременно.
Snusmumriken
Влепи newclient:settimeout(0.1)
Snusmumriken
В противном случае, оно будет сидеть и ждать пока клиент полностью не обработается, и список клиентов как бы не очень нужен.
Nikolai
хм, ну это же вообще до ужаса затормозит все, типа, 10 клиентов будет обходить за 1 секунду
Snusmumriken
Вот для этого придумали select.
Snusmumriken
Вообще, сетевое взаимодействие — жутко замороченная фигня.
Snusmumriken
Тут или в лоб писать блокирующий коннект с одним клиентом, или фигачить полноценный мега-менеджер коннектов с парсингом и всем фаршем.
Nikolai
Блин, тогда, видимо, надо начинать с начала, я чет думал, просто список клиентов сохранять и.. ну в общем как я и сделал
Snusmumriken
client:receive() без таймаута будет блокировать до закрытия коннекта.
Nikolai
Да вот в том то и дело, что не блокирует!
Snusmumriken
Уверен?
Nikolai
Меня это больше всего удивило, там или nil или месседж
Nikolai
а вот accept блокирует
Snusmumriken
client:receive("*l") будет блокировать пока не придёт \r\n.
Nikolai
ну вот клиент, глянь сам как он себя ведет
local socket = require("socket")
local host, port = "niks.ml", 51515
local tcp = assert(socket.tcp())
function sleep(sec)
socket.select(nil, nil, sec)
end
tcp:connect(host, port);
while true do
tcp:send("hello world\n");
local s, status, partial = tcp:receive()
print(s or partial)
sleep(0.1)
end
Nikolai
То ли это какие-то причуда платформы, то ли я хз как это еще можно объяснить
Nikolai
ну, на клиенте я sleep поставил чтобы успевать за сообщениями следить.
fgntfg
Nikolai
открывал в 4 вкладках, и никаких задержек не возникает
Nikolai
В общем, чудная штука
Snusmumriken
Snusmumriken
TCP настроен как бы на обработку потоков. То что ты отправил сообщение — ничего не значит, потому что в TCP не бывает отдельных сообщений, только потоки.
Snusmumriken
Поток делится на отдельные сообщения программно. В луасокете есть программный костыль в виде receive("*l"). А без этого, оно должно выдавать то что принято только после прерывания потока.
Snusmumriken
Или в виде такого:
sock:settimeout(...)
local data, status, partial = sock:receive()
В data придёт сообщение если коннект прервался, в status — какая-нибудь фигня типа "timeout", а в partial — то что было принято до таймаута, то есть следующий код по стандарту —
data = data or partial
И дальше — обработка принятого чанка, объединение его с предыдущими буферами, парсинг и так далее.
Snusmumriken
Да вроде уже разобрался, 25 лет лоб, а никак не привыкну, что надо давать себе на разобраться чуть больше 5 минут. Просто всегда казалось, что receive должен быть блокирующим. Но раз я уже приполз с вопросами, не подскажешь, я тут не делаю никакой херни из за которой память течь будет?
local socket = require("socket")
local server = assert(socket.bind("*", 51515))
local tcp = assert(socket.tcp())
server:settimeout(0.1)
local clients = {}
function checkClients()
local newclient = server:accept()
if not newclient then return end
table.insert(clients,newclient)
end
while true do
checkClients()
for i, client in pairs(clients) do
local resp = client:receive()
if not resp then
table.remove(clients, i)
client:close()
else
print(resp)
client:send("ok\n")
end
end
end
Кстати, заметил у тебя тут лишний
local tcp = assert(socket.tcp).
Snusmumriken
Вот так оно будет пахать, если разделителем сообщений будет \r\n:
local sleep = require'socket'.sleep
local socket = assert(require'socket'.bind("*", 51515))
socket:settimeout(0)
local clients = {}
function clients:accept(socket)
local sock, status = socket:accept()
while sock do
sock:settimeout(0)
table.insert(self, sock)
end
end
function clients:process()
for i, sock in ipairs(self) do
-- по хорошему, тут должны быть таймауты
-- если клиент грубо разорвал коннект
local data, status = sock:receive("*l")
if data and self.onMessage then
self.onMessage(sock, data)
end
if status == "closed" or status == "disconnect" then
table.remove(self, i)
end
end
end
function clients:onMessage()
-- в качестве self придёт sock
self:send("hello world\n")
end
while true do
clients:accept()
clients:process()
sleep(.5)
end
аннлн
аннлн
есть же cqueues.
аннлн
да, я уже слышал, что под винду его нет, но ты ж не юзаешь винду в проде.
Snusmumriken
Да и зачем cqueues когда есть gevent?
аннлн
cqueues это не ещё одна сторонняя либа.
Snusmumriken
Да и зачем gevent когда есть tornado?
аннлн
кекеке