
Aydar
08.09.2017
15:23:44

Vadim
08.09.2017
15:24:18
нет, у меня GNU

Чай
08.09.2017
15:24:40

Vadim
08.09.2017
15:24:40
(с юникса я слез лет 15 назад)

Google

Vadim
08.09.2017
15:24:45
плюс-минус тапок

Aydar
08.09.2017
15:25:33


Snusmumriken
08.09.2017
16:25:02
Кстати, интересный момент! Слак - удивительно тяжелый мессенджер, как раз разбивается на несколько процессов, каждый проект - отдельный процесс, главный процесс и ещё один процесс. Благодаря сему гениальному разбиению, мессенджер способен сжирать 1.5гб оперативки.
А вдруг это значит, что много процессов это плохо? И нодин подход с циклом в одном потоке более выгодный?
Дело же не в процессах, а в менеджменте памяти : )
Когда ты кешируешь 100500 вещей, а потом снова кешируешь и ещё раз кешируешь, строишь хеши для быстрого поиска/доступа - как раз выжираются 1.5 гб памяти.
Телеграмм - однопоточен. Мало того, абсолютно все сообщения, которые успели придти пока телеграмм был закрыт - приходят одним единственным запрос-ответом.
Это лишний раз подтверждает то, что подход золотого молотка - не работает : )


annelin
08.09.2017
16:46:44
как отправить бинарные данные в процесс. который открыли popen'ом и прочитать оттуда вывод?
`tts = require('libtts')
stream = tts.synthesize('в рот ебал', 'ru') — it is binary mp3 stream —
mpg123 = io.popen('/usr/bin/mpg123 -q -s -b 1024 -f 8192 —mono -r 8000 -w - -', 'w') — open program
mpg123:write(stream) — write our mp3 stream to stdout —
sln = mpg123:read('*a') — read output —
—mpg123:close()
sln_file = io.open('file.sln', 'w') — write output —
sln_file:write(sln)
sln_file:close()`
не работает
точнее, работает, но высирает stdout программы (mpg123) в консоль, а не в переменную

Snusmumriken
08.09.2017
16:48:23
io.popen('program -file "'..filepath..'")
Например так.

annelin
08.09.2017
16:48:33
у нас нет файла
и желательно обойтись без создания

Snusmumriken
08.09.2017
16:48:55
А как программа запускается с бинарными? : )
Запиши в файл тогда.

Google

annelin
08.09.2017
16:49:06
мы считали бинарный поток в переменную
я передаю это в stdin программе

Snusmumriken
08.09.2017
16:49:22
Программа вообще способна к обработке бинарных в команде запуска?

annelin
08.09.2017
16:49:24
а вот из stdout прочитать уже не могу
мы ей из STDIN скармливаем
что-то вроде cat mp3file | mpg123... -
не хватает опции "a" к io:popen'у

Snusmumriken
08.09.2017
16:50:26
io.popen возвращает всё что программа выдала в stdout.
Ну, должна, по крайней мере : )

annelin
08.09.2017
16:51:40
я открываю popen с флажком "w"
на запись)
этим самым передаю данные на вход программе

Snusmumriken
08.09.2017
16:52:06
Извращенец ))0
Хотя хрен знает, может, некоторые умеют так работать, не сталкивался.

annelin
08.09.2017
16:52:29
`tts = require('libtts')
stream = tts.synthesize('в рот ебал', 'ru') — it is binary mp3 stream —
mpg123 = io.popen('/usr/bin/mpg123 -q -s -b 1024 -f 8192 —mono -r 8000 -w out.sln -', 'w') — open program
mpg123:write(stream)`
вот так работает
но вывод записывается в out.sln
т.е. мы создаём файл

Snusmumriken
08.09.2017
16:53:04
А без -w оно куда пишет? : )

annelin
08.09.2017
16:53:10
в консоль

Snusmumriken
08.09.2017
16:53:16
Ну и считывай это.

Google

annelin
08.09.2017
16:53:19
как?

Snusmumriken
08.09.2017
16:53:36
mpg123:read('*all')

annelin
08.09.2017
16:53:41
ага
хуй
потому что мы открыли mpg123 с "w"
на запись

Snusmumriken
08.09.2017
16:53:48
Открываешь в режиме rw.

annelin
08.09.2017
16:54:09
с rw не открывается
в том-то и вопрос - как открыть popen на чтение-запись :)

Snusmumriken
08.09.2017
16:54:59
a+?
http://lua-users.org/wiki/IoLibraryTutorial

annelin
08.09.2017
16:55:10
io.popen (prog [, mode])
Starts program prog in a separated process and returns a file handle that you can use to read data from this program (if mode is "r", the default) or to write data to this program (if mode is "w").
a+ это у open()

Snusmumriken
08.09.2017
16:56:15
Я подозреваю что io.popen поддерживает те же самые режимы что и open.
Проверяй а не спорь.

annelin
08.09.2017
16:56:55
я проверил a, a+, rw, r ,w, w+

Aydar
08.09.2017
16:57:08

Snusmumriken
08.09.2017
16:57:09
Ошибку дропает?

annelin
08.09.2017
16:57:17
вместо хендла возвращает nil
я уже нагуглил решение
спойлер: NEEQUAQUE

Snusmumriken
08.09.2017
16:58:03
Тогда пиши во временный файл )))
Я, когда развлекался с подписями crypto pro - так и делал ))
И да, я тоже не люблю когда нельзя обойтись без лишней записи на хард. Что поделать.

Google

Snusmumriken
08.09.2017
17:01:37
Знаешь как ты можешь выкрутиться?
1. Использовать эту фиговину как библиотеку, написать ffi-биндинг или dll(so)-либу.
2. Написать отдельную софтину, которая умеет принимать бинарь прямо в команде запуска (дофига огромная команда получается, но что поделать)
3. Разобраться с этой, мало ли что упустил.

Aydar
08.09.2017
17:02:44

Snusmumriken
08.09.2017
17:03:18
Да, он самый офигительный и быстрый, как с реализации так и по производительности. Если уметь писать на сишке.

Aydar
08.09.2017
17:04:06

Snusmumriken
08.09.2017
17:05:50
Ну это вообще классика. А я его прочитал в пятнадцать лет, когда ещё не думал о кодинге (типа, для лёгкого чтения перед сном), а сейчас забыл нафиг ((((

Влад
08.09.2017
17:06:01
У меня есть код на луа, который через либу lua-rs232 общается с железкой. Проблема в том, что используя lanes, я могу открыть /dev/ttyUSB0 только в одном потоке, и не могу через linda передать дескриптор открытого порта. А мне надо в одном потоке читать оттуда данные(находясь в бесконечном цикле проверки нового символа), а в другом потоке писать туда данные, в зависимости от каких-то событий.
Кто нибудь может подсказать, как мне это сделать? Либо как-то передать дескриптор в другой потоке, либо создать копию /dev/ttyUSB0, чтобы я открыл два устройства, и в одно писал, а в другое читал.

Aydar
08.09.2017
17:06:22

Snusmumriken
08.09.2017
17:06:43
У меня есть код на луа, который через либу lua-rs232 общается с железкой. Проблема в том, что используя lanes, я могу открыть /dev/ttyUSB0 только в одном потоке, и не могу через linda передать дескриптор открытого порта. А мне надо в одном потоке читать оттуда данные(находясь в бесконечном цикле проверки нового символа), а в другом потоке писать туда данные, в зависимости от каких-то событий.
Кто нибудь может подсказать, как мне это сделать? Либо как-то передать дескриптор в другой потоке, либо создать копию /dev/ttyUSB0, чтобы я открыл два устройства, и в одно писал, а в другое читал.
Открой lanes-поток, который занимается только и исключительно чтением-записью по команде. Чтобы обработка тусила в другом потоке.

Vlad
08.09.2017
17:07:30
оффтоп, но вот только открыл для себя либген, прекрасное место, почему упоминаний о таких местах сложно встретить повсеместно

Admin
ERROR: S client not available

Влад
08.09.2017
17:08:53
так если я начинаю читать(p:read(1, 200)) из него, то я блокирую поток, пока не прочитаю символ или не истечет таймаут. А мне нужна относительно быстрая реакция на приходящие сообщения, и быстрая запись, если надо. 200мс уже много.

Snusmumriken
08.09.2017
17:09:59
Я кодить начал в 12 лет с перла
Я кодить начал с двадцати лет.
В двенадцать шёл на курсы по паскалю, отходил три занятия (с блок-схемами), потом начались двойки в школе, и мама забрала оттуда, ибо договаривались на отсутствие двоек (((

Влад
08.09.2017
17:12:35
у либы нет буфера на прием :( соотвественно, если задумались при отправке, потеряли то, что нам хотели отправить.

Snusmumriken
08.09.2017
17:13:23
Ничоси. Даже у микроконтроллеров обычно есть буферы на ногах. Хм.

Влад
08.09.2017
17:13:53
ну на символ есть, вроде.

Snusmumriken
08.09.2017
17:15:47
Карочи, смотри.
1. Поток приёма - постоянно, в бесконечном цикле считывает фигню с девайса и от главного потока.
2. Если нам начали что-то передавать - считываем (до символа-терминатора), занимаемся исключительно считыванием.
3. Если пришла команда на отправку - отправляем. Потом дальше считываем.
Хм, это просто приёмо-передатчик в потоке.

Влад
08.09.2017
17:16:53
надо попробовать, да. боюсь что проц нагрузит постоянное кручение в потоке с нулевым таймаутом

Snusmumriken
08.09.2017
17:17:21
Не нулевой таймаут, влепи там слип на 0.05с, если ничего не пришло.
Если пришло - не надо слипать, надо принимать.

Google

Snusmumriken
08.09.2017
17:20:10
Вот тебе нужно почти то же самое, только вместо повторной отправки сообщения - анализ приёма от основного потока, мало ли ему надо что-то отправить.
Слип если ничего не происходит - присутствует. Грузит не особо, в общем.
P.S. Это - обнаружение устройств в локалке по ssdp.

annelin
08.09.2017
17:33:51
короче
если кому понадобится
передать в процесс в STDIN что-то и получить из STDOUT
https://pastebin.com/a5Z3TnBd то вот :)

Aydar
08.09.2017
18:07:17

Snusmumriken
08.09.2017
18:07:48
Ну, мне не пофиг, поэтому я делаю ffi-биндинги.

Aydar
08.09.2017
18:09:11

Snusmumriken
08.09.2017
18:09:47
Ага. Ну, ты можешь углядеть, что тут есть подгрузка динамической либы в зависимости от оси/битности.

Aydar
08.09.2017
18:10:47

Snusmumriken
08.09.2017
18:11:38
Потому что могу.
Почему нет?
Оверхед нулевой, возможность инициализации всяких сишных буферов/структур для функций - присутствует, и всё такое.
Кроссплатформа - аналогично.
Перекомпиляций виртуальной машины - не нужно.
Писать сишную либу-оболочку тоже не нужно.

Aydar
08.09.2017
18:12:24

Snusmumriken
08.09.2017
18:12:51
Боюсь что нулевой : )
Ну, аналогичный вызову обычной луа-функции.

Aydar
08.09.2017
18:12:58

Snusmumriken
08.09.2017
18:13:16
Нет этой зависимости.
Luajit содержит ffi.

Aydar
08.09.2017
18:13:30
А ты про jit
Тогда конечно

Snusmumriken
08.09.2017
18:14:32
Да, есть необходимость использования luajit. Только одна виртуальная машина, на которой оно работает.
Ну, то есть про ванильную lua/5.2/5.3 стоит забыть.
Правда, я и так пишу исключительно на luajit, поэтому пофигу.
И она используется в 90% случаев на всём высоконагруженном.

Aydar
08.09.2017
18:15:15

Snusmumriken
08.09.2017
18:15:23
То есть, openresty/nginx/tarantool = luajit.
Обычные биндинги? Это какие?