Leon174
Я как-то заехал в этот район, обычно по другой улице по краю езжу, а тут заехал прям в эпицентр. Я охренел. Это гетто самое натуральное, только еще не очень заселенное. Там света белого не видно, дома-то некоторые под 30 этажей. Зачем!?? Ну и планировка эта... "Тут птицы не поют, деревья не растут", едрить их через коромысло.
Бгг... Ну, хоть так, чо. Хотя принципиально ничего не поменялось. Все так же перегруженный людьми район, который неведомо как разъезжается, что на личном транспорте, что на джамшутках. Там и до этого района был перегруз транспорта, что за ад сейчас даже представлять не хочу. https://www.youtube.com/watch?v=nxjWQksZWyg
кота
Ух, триггернуло. Купили мы, значит, квартиру в ЖК на котловане. С самим ЖК вроде не прогадали, рядом с центром, но не в центре, проект уютный, и по центру двора внушительная площадка-парк, размером с центральный парк в моем родном городе, и дома не дают тень во дворе разве что в полдень. Застройщик крутой, плюс еще старается, потому, что сдает пока только первые 3 дома из 9, нужно товарный вид поддерживать. Но вот первые дома стали подходить к сдаче, обустроили двор, прилежащие территории, застелили все газонами. Со стороны улицы тоже дорожки-газоны. И вот наступила суббота. Работяги отдыхают, кирпичи с неба не падают, так что сторож расслабился(ну или из промо-соображений сказали не гонять), и из соседних и не очень домов стали собираться зеваки. Свиноматки по газону, который не оправился от транспортировки, не говоря уж о том, чтобы прижиться, разложились в рядок, и вдоль этого рядка свинодетки побежали делать сальтуху. Во дворе играют дети разных возрастов, зона барбекю уже опробована и обмыта, а балки, между которыми натянута тарзанка, пошли трещинами(и какого черта они из дерева? Не так часто советские практики бывают настолько уместны и удачны, и тут вдруг их не применяют). А огражден двор шлагбаумом безо всяких намеков на ворота в перспективе, то есть, после релиза ситуация только усугубится. В сторожевой будке, конечно, появится человек, но ему же не проверять каждого пешехода, который под этим шлагбаумом полезет, чтобы срезать дорогу. Да и «лицевой» газон в любом случае в открытом доступе, и прижиться ему явно не дадут
квартиру...
кота
у меня сразу флешбеки
кота
Чтоб я так жил
аннлн
>:3
аннлн
IT'S A LION!
fgntfg
У меня новый телефон, кто это?
fgntfg
Так, дело за малым, надо вспомнить пароль от 4pda
кота
надо было ставить кипасс
кота
кота
А лучше 1password
fgntfg
Не, я пароль помню, в логине я не уверен
fgntfg
Эт у меня в браузере такое
кота
А так бы всё помнил
Единственный минус если ключ проебал то можно делать бочку
кота
По этому лучше использовать 1password
Leon174
А лучше 1password
Чем он лучше Keepass?
кота
Чем он лучше Keepass?
Тем, что всё онлайн и тем, что не завалил ни одного аудита огоспаде все твои пароли на сервере у дяди какой полуумный на такое подпишется (я например)
Leon174
Ясно, остаюсь на кипасе.
кота
На флешечке?
кота
А бд?
Leon174
Дубли есть, конечно. Или что бд/ключ?
кота
Дубли есть, конечно. Или что бд/ключ?
А если ты забыл ключ У меня так было, уехал значит я в другой город Бд на гит сервере моем хостится А вот ключ я забыл
кота
Не мог пиццу даже заказать
кота
Хорошо хоть немного нала было
fgntfg
Максимально ебано
fgntfg
У меня физически карты с собой всегдв
Lämppi
А лучше 1password
А лучше пароль как qwerty123456
Nikolai
ставь plys если узнал себя
кота
Кто-то использовал терминальный эмулятор алакритти?
кота
Проблемы возникали? Если да, то какие
fgntfg
fgntfg
Nikolai
Блен, кажется, я чего-то не понимаю, разве, если по сокету ничего нет, процесс не должен спать?
B
немного музыки
Snusmumriken
Блен, кажется, я чего-то не понимаю, разве, если по сокету ничего нет, процесс не должен спать?
Если ты используешь select с некоторым минимальным таймаутом — должен спать. Но не исключено что ядро проца на пределах своей мощности проверяет, не написали ли чего в сокет. У тебя ведь неблокирующая фигня?
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
хм, ну это же вообще до ужаса затормозит все, типа, 10 клиентов будет обходить за 1 секунду
А у тебя тут он будет обходить 10 клиентов по порядку, начиная с первого, пока тот не закроет коннект, кык.
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
открывал в 4 вкладках, и никаких задержек не возникает
Кароч, я чекну, но в целом это странно.
Snusmumriken
TCP настроен как бы на обработку потоков. То что ты отправил сообщение — ничего не значит, потому что в TCP не бывает отдельных сообщений, только потоки.
Snusmumriken
Поток делится на отдельные сообщения программно. В луасокете есть программный костыль в виде receive("*l"). А без этого, оно должно выдавать то что принято только после прерывания потока.
Snusmumriken
Или в виде такого: sock:settimeout(...) local data, status, partial = sock:receive() В data придёт сообщение если коннект прервался, в status — какая-нибудь фигня типа "timeout", а в partial — то что было принято до таймаута, то есть следующий код по стандарту — data = data or partial И дальше — обработка принятого чанка, объединение его с предыдущими буферами, парсинг и так далее.
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.
Десять тысяч сторонних либ забыл спросить
Snusmumriken
Да и зачем cqueues когда есть gevent?
аннлн
cqueues это не ещё одна сторонняя либа.
Snusmumriken
Да и зачем gevent когда есть tornado?
аннлн
кекеке