Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
 С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Привет друзья. Как дела?

Какие пятничные темы вы хотели-бы услышать?

(Пятничные темы - любые технологичные. По программированию. Но не срочные. Не продуктовы баги вобщем.)
19 мар 21, 20:46    [22297515]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dima T
Member

Откуда:
Сообщений: 15689
Весенние каникулы у детей начинаются. Зефирки учимся жарить на мангале.
19 мар 21, 22:17    [22297536]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
mayton, интересует запрет повторного запуска проги той же папки. Из другой можно. Главный вопрос - активировать прогу уже запущенную из этой папки.
19 мар 21, 22:20    [22297537]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Создавай в текущей папке .pid файл с кодом текущего процесса.

Да это горбуха.

Сообщение было отредактировано: 22 мар 21, 12:11
19 мар 21, 22:26    [22297538]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Dima T
Весенние каникулы у детей начинаются. Зефирки учимся жарить на мангале.

Разве зефирки жарят? Обычно - сосиски.
19 мар 21, 22:28    [22297539]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
mayton
Создавай в текущей папке .pid файл с кодом текущего процесса.

А если прога крашнеца и не уберет за собой .pid?
19 мар 21, 22:28    [22297540]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
mayton
Dima T
Весенние каникулы у детей начинаются. Зефирки учимся жарить на мангале.

Разве зефирки жарят? Обычно - сосиски.

Кстати да. Никогда не понимал этого буржуйского извращения. Или у них зефир другой?
19 мар 21, 22:29    [22297541]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
didgik
mayton, интересует запрет повторного запуска проги той же папки. Из другой можно. Главный вопрос - активировать прогу уже запущенную из этой папки.

Ну… Создать именованный мьютекс (уровня системы). Имя мьютекса должно содержать папку запуска. При этом мьютекс нужно захватить при запуске и никогда не нужно отпускать.

А вот переключиться на уже запущенное приложение...
19 мар 21, 22:35    [22297546]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dima T
Member

Откуда:
Сообщений: 15689
mayton
Dima T
Весенние каникулы у детей начинаются. Зефирки учимся жарить на мангале.

Разве зефирки жарят? Обычно - сосиски.

Жарят. Все горячее вкуснее чем холодное. Фотки дал бы, но с телефона пишу, не дома, комп дети отжали (((
19 мар 21, 22:35    [22297547]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
didgik
mayton
Создавай в текущей папке .pid файл с кодом текущего процесса.

А если прога крашнеца и не уберет за собой .pid?

Если крашнеца... При старте прога должна взять эксклюзивные права на доступ к этому файлу. Если твоя прога крашается, то все ограничения доступа слетают. Как и тот заблокированный мьютекс.
19 мар 21, 22:38    [22297548]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
petrav
didgik
пропущено...

А если прога крашнеца и не уберет за собой .pid?

Если крашнеца... При старте прога должна взять эксклюзивные права на доступ к этому файлу. Если твоя прога крашается, то все ограничения доступа слетают. Как и тот заблокированный мьютекс.

С мьютексом понятно, не понятно причем тут .pid.
А как активировать уже запущенную прогу по мьютексу?? И да. В винде.
19 мар 21, 22:41    [22297550]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dima T
Member

Откуда:
Сообщений: 15689
didgik
petrav
пропущено...

Если крашнеца... При старте прога должна взять эксклюзивные права на доступ к этому файлу. Если твоя прога крашается, то все ограничения доступа слетают. Как и тот заблокированный мьютекс.

С мьютексом понятно, не понятно причем тут .pid.
А как активировать уже запущенную прогу по мьютексу?? И да. В винде.

"Активировать" это что значит в реальной жизни?

Сообщение было отредактировано: 19 мар 21, 22:47
19 мар 21, 22:47    [22297552]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
didgik
petrav
пропущено...

Если крашнеца... При старте прога должна взять эксклюзивные права на доступ к этому файлу. Если твоя прога крашается, то все ограничения доступа слетают. Как и тот заблокированный мьютекс.

С мьютексом понятно, не понятно причем тут .pid.

Я не знаю, что это такой за файл .pid. Видимо, что это файл содержащий process id. Имея process id возможно можно определить дескриптор главного окна этого процесса и послать ему что-то типа сообщения WM_SHOW.

Кстати, Process Explorer умеет определять какой процесс держит файл. Так что в файл записывать process id, видимо, не нужно.

didgik
А как активировать уже запущенную прогу по мьютексу?? И да. В винде.

Я не знаю.
19 мар 21, 22:48    [22297553]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
Вот только что я запустил программу, которая держит определённый файл.
Потом я запустил Process Explorer. Главное меню: Find -> Find handle or DLL.
По имени файла нашёлся процесс, который держит этот файл.

Дальше ПКМ на этом процессе: Window -> Bring to front. Всё, приложение
активировано на основе пути к файлу, который (файл) держит это приложение.

Как блокировку файла заменить на блокировку глобального мьютекса... Ну...
может можно.
19 мар 21, 22:57    [22297557]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
Dima T

"Активировать" это что значит в реальной жизни?

Чтоб запущенная прога развернулась с панели задач.

Впрочем, вопрос только в том, как во второй копии получить хендл окна уже запущеной проги из этой же папки.
19 мар 21, 22:57    [22297558]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
didgik
Dima T

"Активировать" это что значит в реальной жизни?

Чтоб запущенная прога развернулась с панели задач.

Впрочем, вопрос только в том, как во второй копии получить хендл окна уже запущеной проги из этой же папки.

How to get main window handle from process id?.

Поиск в гугле по: winapi get main window handle for process id.
19 мар 21, 23:04    [22297560]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
petrav
didgik
пропущено...

Чтоб запущенная прога развернулась с панели задач.

Впрочем, вопрос только в том, как во второй копии получить хендл окна уже запущеной проги из этой же папки.

How to get main window handle from process id?.

Поиск в гугле по: winapi get main window handle for process id.

Тогда вопрос в том, как во второй копии получить process id уже запущеной проги из этой же папки.
19 мар 21, 23:07    [22297561]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
didgik
petrav
пропущено...

How to get main window handle from process id?.

Поиск в гугле по: winapi get main window handle for process id.

Тогда вопрос в том, как во второй копии получить process id уже запущеной проги из этой же папки.

Уже всё же сказано.

- В .pid файл записать process id. Но на случай падения приложения нужно держать эксклюзивные права на запись в этот файл.
- Можно держать эксклюзивные права вообще на пустой файл в папке приложения. И по пути к этому файлу определить process id — process explorer так может.
- Можно попробовать по имени мьютекса (который содержит путь к папке) определить process id, который его держит.

Тут есть ещё момент, что на компе может быть авторизовано сразу несколько пользователей. WinAPI неисчерпаем так же как и атом. Это ещё В.И. Ленин говорил.
19 мар 21, 23:17    [22297565]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
у меня есть ini файл. Наверно можно его заюзать под это дело.
И писать в него pid при запуске.
Т.е. при запуске проги, мы проверяем, есть ли возможность в него писать, если нет, то берем оттуда pid, активируем запущенный экземпляр и закрываемся. И никакие мьютексы не нужны.

Осталось узнать про эксклюзивные права записи. Как ставить и как проверять.

Сообщение было отредактировано: 19 мар 21, 23:22
19 мар 21, 23:28    [22297566]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
didgik
у меня есть ini файл. Наверно можно его заюзать под это дело.
И писать в него pid при запуске.
Т.е. при запуске проги, мы проверяем, есть ли возможность в него писать, если нет, то берем оттуда pid, активируем запущенный экземпляр и закрываемся. И никакие мьютексы не нужны.

Осталось узнать про эксклюзивные права записи. Как ставить и как проверять.

При запуске проги пытаемся заблокировать файл на эксклюзивную запись.
Если получилось, то записываем в ini файл pid и запускаемся.

Если не получилось, то пытаемся открыть этот файл на чтение и читаем pid.
Если получилось, читаем pid. По нему получаем HWND и активируем окно. Выходим.

Эксклюзивные права на запись, например, проверяются попыткой получить такие
права. Получил - значит ты хозяин. Документация на функцию ::CreateFile() из WinAPI.
19 мар 21, 23:36    [22297570]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
о, а может сразу HWND в ини пихать?
19 мар 21, 23:38    [22297571]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
didgik
о, а может сразу HWND в ини пихать?

Не знаю. Попробуйте.
19 мар 21, 23:48    [22297576]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Эксклюзивные права на запись, например, проверяются *попыткой* получить такие
права. Получил - значит ты хозяин. Документация на функцию ::CreateFile() из WinAPI.

Ага. Прочитать PID из файла, который не удалось открыть. Отличный план.

Может, не стоит маяться дурью с файлом, а сразу искать окно?..

Posted via ActualForum NNTP Server 1.5

20 мар 21, 01:27    [22297594]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
Dimitry Sibiryakov

petrav
Эксклюзивные права на запись, например, проверяются *попыткой* получить такие
права. Получил - значит ты хозяин. Документация на функцию ::CreateFile() из WinAPI.

Ага. Прочитать PID из файла, который не удалось открыть. Отличный план.

Может, не стоит маяться дурью с файлом, а сразу искать окно?..


Прочитать PID из файла, который не удалось открыть на запись. Читать можно. Я так понял.

А поиск окна я не осилил пока что. В этом и проблема.
20 мар 21, 02:11    [22297597]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10925
Dima T
Все горячее вкуснее чем холодное.
Особенно водка и мороженое.
20 мар 21, 06:06    [22297604]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dima T
Member

Откуда:
Сообщений: 15689
didgik
Dimitry Sibiryakov

пропущено...

Ага. Прочитать PID из файла, который не удалось открыть. Отличный план.

Может, не стоит маяться дурью с файлом, а сразу искать окно?..


Прочитать PID из файла, который не удалось открыть на запись. Читать можно. Я так понял.

А поиск окна я не осилил пока что. В этом и проблема.

Не надо никуда PID писать. Вдруг твой процесс скоропостижно упал не стерев PID из файла, а другой запустился с этим же PID. Виндавс может выдать тот же PID другому процессу.

Просто перебери все процессы и смотри каким EXE они созданы. Найдешь свой, значит оно.

Затем перебираешь окна внутри процесса.

Но проще сразу искать нужное окно FindWindowEx()

Сообщение было отредактировано: 20 мар 21, 07:08
20 мар 21, 07:13    [22297606]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dima T
didgik
пропущено...


Прочитать PID из файла, который не удалось открыть на запись. Читать можно. Я так понял.

А поиск окна я не осилил пока что. В этом и проблема.

Не надо никуда PID писать. Вдруг твой процесс скоропостижно упал не стерев PID из файла, а другой запустился с этим же PID. Виндавс может выдать тот же PID другому процессу.

Факт того что кто-то держит эксклюзивные права на запись является подтверждением того, что PID актуальный.

Dima T
Просто перебери все процессы и смотри каким EXE они созданы. Найдешь свой, значит оно.

Кстати, да. Наверное, это самое простое. Перебрать все процессы и посмотреть полные пути к файлу .exe. Правда отсутствует некий функционал атомарности. Что будет если из одной папки практически одновременно будет дважды запущен один exe? Скорее всего они оба завершат свою работу.

Ну и это не сработает если в будущем нужно будет «блокировать» не по папке где находится exe, а по некоторой другой папке куда конкурирующие процессы хотят получить эксклюзивные права на запись. В данном случае блокировка файла в этой папке гораздо лучше.

Dima T
Но проще сразу искать нужное окно FindWindowEx()

Поиск по заголовку окна? Ну это никуда не годится.

Еще можно подумать про создание разделяемой области памяти куда что-то будем писать — pid, например.
Ну и вроде есть функционал временных файлов. Файлов, которые удаляет ОС при завершении процесса.
20 мар 21, 12:12    [22297644]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Поиск по заголовку окна?

Обычно ищут по классу окна, а не заголовку.

Posted via ActualForum NNTP Server 1.5

20 мар 21, 12:58    [22297653]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
didgik
Dimitry Sibiryakov

пропущено...

Ага. Прочитать PID из файла, который не удалось открыть. Отличный план.

Может, не стоит маяться дурью с файлом, а сразу искать окно?..


Прочитать PID из файла, который не удалось открыть на запись. Читать можно. Я так понял.

А поиск окна я не осилил пока что. В этом и проблема.

Там не нужны эксклюзивные права. Если запускать в поддереве %USER_PROFILE% то нам
скорее всего хватит обычных файловых прав. И нужны будут парочка ОС API функций
которые 1) берут свой собственный PID, 2) проверяют что среди списка процессов нету
заданного кастомного PID.

Можем попробовать набросать алгоритм.

Против семафоров я не имею ничего против но они должны быть именованные, чтобы
структура запускаемых процессов имела связи 1:1 семафор с user_dir текущего процесса.
20 мар 21, 13:17    [22297654]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
FindWindow не подошло. Если окон данного класса больше одного, то оно возвращает первый попавшийся хендл. Соответственно надо перебирать все окна и опять вычислять есть ли нужное.
20 мар 21, 13:24    [22297655]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

didgik
Соответственно надо перебирать все окна и опять вычислять есть ли нужное.

Да. В чём проблема? На две строчки больше кода написать - пальцы боишься стереть?..

Posted via ActualForum NNTP Server 1.5

20 мар 21, 13:40    [22297658]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
Dimitry Sibiryakov

didgik
Соответственно надо перебирать все окна и опять вычислять есть ли нужное.

Да. В чём проблема? На две строчки больше кода написать - пальцы боишься стереть?..

FindWindow тут не нужен.
20 мар 21, 13:42    [22297659]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

didgik
FindWindow тут не нужен.

Это самый простой из способов "активировать прогу уже запущенную из этой папки". Но смелые
эксперименты молодых сурков не остановить...

Posted via ActualForum NNTP Server 1.5

20 мар 21, 13:46    [22297660]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
Dimitry Sibiryakov

didgik
FindWindow тут не нужен.

Это самый простой из способов "активировать прогу уже запущенную из этой папки". Но смелые
эксперименты молодых сурков не остановить...

Я тоже так думал. Но оказалось, что это не так.
20 мар 21, 13:48    [22297661]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921
didgik
Я тоже так думал. Но оказалось, что это не так.

Оказалось, что ты просто и этого не сумел. Но хочу тебя огорчить: остальные способы не
только сложнее, но ещё и не работают. В современных Windows программа неспособна
активизироваться самостоятельно, без внешней помощи. И это правильно.

PS: Хотя, конечно, твоё "активироваться" может отличаться от моего "вывести окно на передний план".

Сообщение было отредактировано: 20 мар 21, 13:52
20 мар 21, 13:57    [22297665]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
didgik
Member

Откуда:
Сообщений: 968
Dimitry Sibiryakov

didgik
Я тоже так думал. Но оказалось, что это не так.

Оказалось, что ты просто и этого не сумел. Но хочу тебя огорчить: остальные способы не
только сложнее, но ещё и не работают. В современных Windows программа неспособна
активизироваться самостоятельно, без внешней помощи. И это правильно.


Вопрос не в том, как активизировать программу, а в том, чтоб найти нужную. И да, с помощью FindWindow я не сумел.
20 мар 21, 14:01    [22297666]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

didgik
Главный вопрос - активировать прогу

didgik
Вопрос не в том, как активизировать программу

didgik
а в том, чтоб найти нужную. И да, с помощью FindWindow я не сумел.

RTFM:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowthreadprocessid
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmodulefilenameexa

Posted via ActualForum NNTP Server 1.5

20 мар 21, 14:17    [22297673]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
В продолжение пятницы-субботы.

По мотивам https://www.sql.ru/forum/1334409/tshark-bencode

Решил писать события протокола DHT в Apache Cassandra. Задача без особого смысла. Так. Бесконечно играющая.
Я ее думаю в выходные дни. И когда жене от меня ничего не нужно. И в целях изучения таких ... распределённых
и децентрализованных штук. Но для начала - понаблюдать статистику. Сколько я вижу активных узлов в течение
дня. Сколько они ищут. Что они публикуют.

Первая идея была - фиксировать UDP-пакеты типа "поиск ноды"

(уже декодированый пакет).
{
{
  "a" : {
    "id" : "2ecb156e5b97c9b0f5eda2d7a89a84b1dcf9b4a3",
    "target" : "2ecb156e5b97c9b0f5eda2d7a89a84b1dcf9b4a3"
  },
  "q" : "66696e645f6e6f6465 ( 'find_node' )",
  "t" : "b9390000",
  "v" : "5554b38e",
  "y" : "71 ( 'q' )"
}


И фиксировать количество таких find-s по каждому таргету. Я предполагал что популярные раздачи тогда
выйдут в некую неравномерную гистограмму.

Первый вариант таблицы был таков (это синтаксис CQL Apache Cassandra. Не-SQL!)
create table nodes(
 node_id text primary key,
 last_ip text,
 last_port int,
 pings_requests int,
 get_peeers_requests int,
 find_nodes_requests int
);


Далее поля счетчики *_requests я планировал обновлять одним update-ом. Типа

cqlsh:dhtspace> update nodes set find_nodes_requests = find_nodes_requests + 1 where node_id = '7d2c835df2f49462a73c00988c7eadcf722c57e1';
InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid operation (find_nodes_requests = find_nodes_requests + 1) for non counter column find_nodes_requests"

Не вышло. Cassandra не позволяет инкремент полей за 1 dml операцию если они не являются типом counter.
Окей. Переделал под счетчики. Но не тут-то было. Таблица со счетчиками не может содержать поля смешанного типа.
cqlsh:dhtspace> drop table nodes;
cqlsh:dhtspace> create table nodes(
            ...  node_id text primary key,
            ...  last_ip text,
            ...  last_port int,
            ...  pings_requests counter,
            ...  get_peeers_requests counter,
            ...  find_nodes_requests counter
            ... );
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot mix counter and non counter columns in the same table"

Получается что для такого использования мне надо держать аж 2 таблицы. С одиаковыми ключами но с разными
атрибутами. Одни для счетчиков - а другие просто для вариативных типов данных.

Вот такой он этот жестокий и коварный No-SQL. Интересно бы узнать мотивацию к такому разделению?

Возможно это были требования жестокой атомарности? Или какие-то другие ограничения distributed систем?
20 мар 21, 18:51    [22297739]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
Получается что для такого использования мне надо держать аж 2 таблицы. С одиаковыми ключами но с разными атрибутами. Одни для счетчиков - а другие просто для вариативных типов данных.

Вот такой он этот жестокий и коварный No-SQL. Интересно бы узнать мотивацию к такому разделению?

Возможно это были требования жестокой атомарности? Или какие-то другие ограничения distributed систем?
Ключевые слова для гугления: нормализация, звезды и снежинки.

Проще говоря, делать классическую звезду (и снежинку как ее развитие) намного выгоднее с точки зрения производительности, и обновления и выборок, для задач подсчета количества.
Это уже с точки зрения выдачи результата проще писать запрос к одной таблице чем помнить что у тебя их две и правильно делать связку таблиц на каждый запрос, но это обычно решается вьюшками.
20 мар 21, 21:02    [22297782]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl
mayton
Получается что для такого использования мне надо держать аж 2 таблицы. С одиаковыми ключами но с разными атрибутами. Одни для счетчиков - а другие просто для вариативных типов данных.

Вот такой он этот жестокий и коварный No-SQL. Интересно бы узнать мотивацию к такому разделению?

Возможно это были требования жестокой атомарности? Или какие-то другие ограничения distributed систем?
Ключевые слова для гугления: нормализация, звезды и снежинки.

Проще говоря, делать классическую звезду (и снежинку как ее развитие) намного выгоднее с точки зрения производительности, и обновления и выборок, для задач подсчета количества.
Это уже с точки зрения выдачи результата проще писать запрос к одной таблице чем помнить что у тебя их две и правильно делать связку таблиц на каждый запрос, но это обычно решается вьюшками.

Какие снежинки? Какая нормализация?

Cassandra - это махровый NoSQL. Joins не поддерживается. Консистетность между таблицами - слабая.
Она есть на уровне eventual consistency. Тоесть грубо говоря каждая таблица лежит в своём собственном
времени.

Почему я взял cassandra? Не знаю. Просто так захотелось. Инженерное любопытство. У нее другие плюшки.
Но тема пока не об этом.
20 мар 21, 22:00    [22297799]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
Какие снежинки? Какая нормализация?

Cassandra - это махровый NoSQL.
И что?
От технической стороны организации базы данных, принципы организации данных не исчезают и не меняются.
NoSQL даже более удобен для организации звезд, и сильнее напоминает о пользе нормализации чем реляционные БД.
20 мар 21, 23:47    [22297811]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl
mayton
Какие снежинки? Какая нормализация?

Cassandra - это махровый NoSQL.
И что?
От технической стороны организации базы данных, принципы организации данных не исчезают и не меняются.
NoSQL даже более удобен для организации звезд, и сильнее напоминает о пользе нормализации чем реляционные БД.

Я думаю что о нормализации пока говорить раненько. Хотя-бы по той причине что в этом домене никто
"дупля не отсреливает". Я имею в виду DHT, KAD, Chord e.t.c. И я пока поставил простую задачу - учесть
количество запросов на публикацию контента от "id". По сути сделать 1 таблицу-лог которая просто фиксирует
число интеракций по id.

По мере поступления информации я буду эту модель нормализовывать. Но пока еще рано говорить о нормализации.
Я просто не знаю как связаны между собой атрибуты id, target, token. Как только уясню - сможем нормализовать.

Обычная бизнесовая проблема. Нехватка знаний по домену.
20 мар 21, 23:53    [22297814]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
Я думаю что о нормализации пока говорить раненько.
Лично я считаю что начинать надо именно с нормализованной базы. Вот есть у нас сущность, определяем ей id - делаем таблицу даже если кроме id ничего другого не известно. Есть атрибут у этой сущности - делаем другую таблицу. И только потом, если убеждаемся что этот атрибут уникален для сущности и его будут дергать часто - тогда можем перенести его в первую таблицу. А если этот атрибут нужен редко, то можно оставить его во вторичной таблице, этаком "расширении".
Денормализация будет полезна на этапе выборок из базы. Вот когда будешь делать отчетную систему на свою базу - тогда и надо заниматься денормализацией, а во всех остальных этапах и особенно на этапе проектирования БД - нормальзованные данные это необходимо.

mayton
И я пока поставил простую задачу - учесть
количество запросов на публикацию контента от "id". По сути сделать 1 таблицу-лог которая просто фиксирует
число интеракций по id.
Ну у тебя типичный OLAP куб уже же строится. Список сущностей (udp пакеты) имеющих атрибут (адрес), и надо подсчитать количество появления атрибута. Так что две таблицы для минимального куба идеально. Одно-лучевая звезда просто напрашивается!
И тут действительно nosql база будет хорошо работать и любые объемы съест не подавившись.

mayton
Я просто не знаю как связаны между собой атрибуты id, target, token. Как только уясню - сможем нормализовать.
Наоборот. Есть три атрибута? Расценивай их как три сущности. А потом уже смотри как они между собой взаимодействуют, что есть атрибут чего.
21 мар 21, 04:52    [22297830]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
White Owl
mayton
Я думаю что о нормализации пока говорить раненько.
Лично я считаю что начинать надо именно с нормализованной базы. Вот есть у нас сущность, определяем ей id - делаем таблицу даже если кроме id ничего другого не известно. Есть атрибут у этой сущности - делаем другую таблицу.

Впервые слышу такое прочтение понятия нормализации.

Это NoSQL так на людей влияет?
21 мар 21, 12:08    [22297856]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
В NoSQL нормализацию заменяют на агрегацию. Это по сути наружение 1НФ и включение в один data-row
целой коллекции других типизированных data-row или документов.

Но в NoSQL - на самом деле технический долг еще более силён чем в реляционках.
Если в Oracle ты можешь по ходу развития доменной модели "подбрасывать" новые связи или
даже поменять роли первичных ключей или расширить их, то в NoSQL системе как один раз сделал дизайн ключей
- так они и будут навсегда. Исправлять - принципиально невозможно. Можно просто пересоздавать таблицы заново
(делать CTAS) и причем ОДНОВРЕМЕННО с изменением семантик. А делать CTAS в продуктовой работающей БД
- это смерти подобно. И диска не хватает обычно и времени регламента нету.

В середине 2010х мне один Моного-разработчик плакался. Жаловался что много информации хранится безо
всякого смысла в ихних базах. Не хватает схем (видимо создавали schema-less). И вообще - лучший способ
потерять какой-то атрибут навсегда - это положить его в документ Mongo.

Сообщение было отредактировано: 21 мар 21, 16:46
21 мар 21, 16:52    [22297900]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
В NoSQL нормализацию заменяют на агрегацию. Это по сути наружение 1НФ и включение в один data-row
целой коллекции других типизированных data-row или документов.
Ну так никто ж не обещал что люди будут понимать смысл и суть используемых инструментов.
То что NoSQL обычно удобнее для агрегации, не значит что надо заменять нормализацию. Кушать плюшки не требует переходить на плюшечную диету.

mayton
Но в NoSQL - на самом деле технический долг еще более силён чем в реляционках.
Если в Oracle ты можешь по ходу развития доменной модели "подбрасывать" новые связи или
даже поменять роли первичных ключей или расширить их, то в NoSQL системе как один раз сделал дизайн ключей
- так они и будут навсегда. Исправлять - принципиально невозможно. Можно просто пересоздавать таблицы заново
(делать CTAS) и причем ОДНОВРЕМЕННО с изменением семантик. А делать CTAS в продуктовой работающей БД
- это смерти подобно. И диска не хватает обычно и времени регламента нету.
А разве в реляционных БД по другому? Можно конечно и попытаться изменить ключ в существующей схеме, но если на изменяемую таблицу ссылаются хоты бы пара других - будет еще замечательно если ctas сработает. А частенько приходится делать полноценный etl, одноразовый, в рамках одной БД, но etl с большой буквой T.

Разница между реляционной и не-реляционной базой на самом деле очень маленькая. И заключается она всего-лишь в том, что в "реляционной" можно определить связи (внешние ключи которые) и сам движок БД будет отслеживать их целостность при изменении данных. А в не-реляционной такой возможности нет, там за целостностью данных надо следить на уровне приложения. И все.
Вся остальная разница чисто косметическая. Другой язык запросов, другие возможности-ограничения на конкретные плюшки (в смысле что именно движок БД способен автоматизировать). Но и только.


Вот смотри, ты сейчас используешь Кассандру которая хочет держать счетчики в отдельных таблицах и не мешать их с полями другого типа. Это плюшка. А Оракл вообще не имеет счетчиков, нет у него такой плюшки в движке, поэтому ораклисты вынужденны использовать обычное целочисленное поле. А еще чтобы сделать автоматическую нумерацию записей ораклистам надо создать sequence. А mssql-овцам не надо, им хватает просто определить поле как autoincrement. А sqlite-овцам нет нужды определять текстовое это поле или числовое, чрезвычайно удобно, очень непривычно и может привести к потерям производительности, но очень удобно. А в IQ нет нужды делать индексы, там каждое поле автоматически индексировано потому что у БД колоночный метод хранения таблиц - очень тормознуто на обновлениях, но для выборок - конфетка.

Это все плюшки, уникальные и местами загадочные, но плюшки конкретных движков и технических решений примененных в них.
Но разве это отменяет принципы организации данных? Ты в любой базе можешь сделать как 0nf простынь, так и снежинку в 5nf (которая теоретический идеал, но никто не видел на практике).

Не, я конечно понимаю что некоторые местные люди считают что data structures в java и data structures в c++ это очень разные data structures и читать книжки использующие "вражеский язык" для понимания самих data structures это уголовно наказуемое деяние. Но ...


mayton
В середине 2010х мне один Моного-разработчик плакался. Жаловался что много информации хранится безо
всякого смысла в ихних базах. Не хватает схем (видимо создавали schema-less). И вообще - лучший способ
потерять какой-то атрибут навсегда - это положить его в документ Mongo.
Повторюсь: инструментом надо уметь пользоваться. От человеческой глупости никакой инструмент спасти не может.
Мало ли ты встречал приложений завязанных на Oracle/MSSQL/etc которые сами следят за связностью данных в разных таблицах? А ведь это типичные RDBMS используемые в модели NR-DBMS и то что они используют язык запросов наследованный от SQL-92 не делает их реляционными.
С другой стороны, я сейчас работаю с nosql базой (разработанной в начале 80-х), совершенно другой язык запросов, таблицы называют файлами и хранят структуру таблиц во внешних текстовых файлах... Но при этом весь доступ к БД организован через одну единственную билиотеку, которая читает те текстовые файлы и самостоятельно следит за целостностью ссылок. Так что несмотря на то что это "библиотека" - на практике получается классический embedded rdbms. При этом она считается и описывается как nosql, потом что там нет вообще ни грамма от sql :) Там конечно тоже не мало странностей и идиотизмов (в первую очередь из-за "встроенности" с которой надо уметь работать), но...

Сообщение было отредактировано: 21 мар 21, 20:16
21 мар 21, 20:21    [22297951]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl

mayton
Но в NoSQL - на самом деле технический долг еще более силён чем в реляционках.
Если в Oracle ты можешь по ходу развития доменной модели "подбрасывать" новые связи или
даже поменять роли первичных ключей или расширить их, то в NoSQL системе как один раз сделал дизайн ключей
- так они и будут навсегда. Исправлять - принципиально невозможно. Можно просто пересоздавать таблицы заново
(делать CTAS) и причем ОДНОВРЕМЕННО с изменением семантик. А делать CTAS в продуктовой работающей БД
- это смерти подобно. И диска не хватает обычно и времени регламента нету.
А разве в реляционных БД по другому? Можно конечно и попытаться изменить ключ в существующей схеме, но если на изменяемую таблицу ссылаются хоты бы пара других - будет еще замечательно если ctas сработает. А частенько приходится делать полноценный etl, одноразовый, в рамках одной БД, но etl с большой буквой T.

Я имел в виду следующее. Стоимость поддержки изменений в реляционной БД ~ равна некой условной величине.
Назовем ее 1 story point. Добавить внешний ключ. 1 единица. Проиндексировать поле - тоже 1 единица. Порезать таблицу
вдоль на 2 суб-таблицы типа родитель-потомок - тоже 1 единица. Я утрирую конечно - но объем работ примерно
одинаков с точки зрения рисков. А в не-реляционных идет так. Сделать плюшку - 0.5 поинтов. Потом еще плюшка - 0.5 поинтов.
А потом прилетает плюшка которая стоит аж 100500 поинтов. Или ее сделать нереально или архитекторы просто ее не хотят
делать по причине того что модель уже настолько далека от желаемого что проще создать новую систему. При том что
в реляционной эта-же плюшка стоила бы ну 3-5 поинтов.

Вот это я имел в виду. Непрогнозируемые затраты.
21 мар 21, 20:40    [22297955]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl

Разница между реляционной и не-реляционной базой на самом деле очень маленькая. И заключается она всего-лишь в том, что в "реляционной" можно определить связи (внешние ключи которые) и сам движок БД будет отслеживать их целостность при изменении данных. А в не-реляционной такой возможности нет, там за целостностью данных надо следить на уровне приложения. И все.

Ну ты даёшь блин. Ну возьми бухгалтерскую учебную бд и втащи ее в не-реляционную с сохранением
целостности денег на транзакциях и отчотах.

Кстати перечисли те системы из класса не-реляционных на которые ты ссылаешся. Тема - это размытая.
Тут - каждый сам себе что-то имеет в виду.
21 мар 21, 20:46    [22297956]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl

Вот смотри, ты сейчас используешь Кассандру которая хочет держать счетчики в отдельных таблицах и не мешать их с полями другого типа. Это плюшка. А Оракл вообще не имеет счетчиков, нет у него такой плюшки в движке, поэтому ораклисты вынужденны использовать обычное целочисленное поле.

Разве в Оракле я не могу сделать такое?

update table1 set counter = counter + 1;


Ровно тоже самое я хотел от Cassandra но она отказала мне в декларации таблиц а вовсе не в реализации этого
чудесного DML.
21 мар 21, 21:08    [22297960]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl
А в IQ нет нужды делать индексы, там каждое поле автоматически индексировано потому что у БД колоночный метод хранения таблиц - очень тормознуто на обновлениях, но для выборок - конфетка.

А вот с этого момента - поподробнее. Column-oriented это не про индекс а про форму хранения.
Не знаком c IQ но идеология column-oriented это не про обновления а про выборки-агрегации.
Разворот на 90 градусов data-row по сути.

Хотя может мы о разных вещах говорим?
21 мар 21, 21:25    [22297963]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl

Мало ли ты встречал приложений завязанных на Oracle/MSSQL/etc которые сами следят за связностью данных в разных таблицах? А ведь это типичные RDBMS используемые в модели NR-DBMS и то что они используют язык запросов наследованный от SQL-92 не делает их реляционными.

Вопрос задан как-то странно. "Мало ли..."

Скажу так. Я встречал много плохих приложений которые благодаря законам и гарантиям RDBMS худо-бедно работали.
И я встречал "очень модные" попытки писать данные в Windows/NTFS и AWS/S3 которые впоследствии становились
мусорной свалкой где нельзя было ничего гарантировать и бизнес-логика должна была просто учитывать возможные
ошибки неконсистентности как данность.
21 мар 21, 21:30    [22297965]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl

С другой стороны, я сейчас работаю с nosql базой (разработанной в начале 80-х), совершенно другой язык запросов, таблицы называют файлами и хранят структуру таблиц во внешних текстовых файлах... Но при этом весь доступ к БД организован через одну единственную билиотеку, которая читает те текстовые файлы и самостоятельно следит за целостностью ссылок. Так что несмотря на то что это "библиотека" - на практике получается классический embedded rdbms. При этом она считается и описывается как nosql, потом что там нет вообще ни грамма от sql :) Там конечно тоже не мало странностей и идиотизмов (в первую очередь из-за "встроенности" с которой надо уметь работать), но...

Что это за волшебная библиотека если не секрет? Я сейчас выпил два по 0.5 светлого и очень сентиментален
и уже готов взять в объятия это чудо и полюбить его крепче чем Oracle в БД и Erlang в отказоустойчивых системах.
21 мар 21, 21:33    [22297966]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
mayton
White Owl

С другой стороны, я сейчас работаю с nosql базой (разработанной в начале 80-х), совершенно другой язык запросов, таблицы называют файлами и хранят структуру таблиц во внешних текстовых файлах... Но при этом весь доступ к БД организован через одну единственную билиотеку, которая читает те текстовые файлы и самостоятельно следит за целостностью ссылок. Так что несмотря на то что это "библиотека" - на практике получается классический embedded rdbms. При этом она считается и описывается как nosql, потом что там нет вообще ни грамма от sql :) Там конечно тоже не мало странностей и идиотизмов (в первую очередь из-за "встроенности" с которой надо уметь работать), но...

Что это за волшебная библиотека если не секрет? Я сейчас выпил два по 0.5 светлого и очень сентиментален
и уже готов взять в объятия это чудо и полюбить его крепче чем Oracle в БД и Erlang в отказоустойчивых системах.
У меня есть форк Кодбейза, на котором работает 1С 7.7, но что там у Сова, я забыл. Возможно старый Advantage, таких было мало, где описания структур хранили отдельно.

Ах да, темка то %$#!@, но зачем?
21 мар 21, 23:27    [22297998]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
Я имел в виду следующее. Стоимость поддержки изменений в реляционной БД ~ равна некой условной величине.
Назовем ее 1 story point. Добавить внешний ключ. 1 единица. Проиндексировать поле - тоже 1 единица. Порезать таблицу
вдоль на 2 суб-таблицы типа родитель-потомок - тоже 1 единица. Я утрирую конечно - но объем работ примерно
одинаков с точки зрения рисков. А в не-реляционных идет так. Сделать плюшку - 0.5 поинтов. Потом еще плюшка - 0.5 поинтов.
А потом прилетает плюшка которая стоит аж 100500 поинтов. Или ее сделать нереально или архитекторы просто ее не хотят
делать по причине того что модель уже настолько далека от желаемого что проще создать новую систему. При том что
в реляционной эта-же плюшка стоила бы ну 3-5 поинтов.
Вот это все - забудь.
Стоимость поддержки изменений в любой БД (реляционной и не) измеряется в IO.

Хочешь обновить одну запись? Читаем с диска в память индекс, в нем находим где в таблице находится нужная запись, читаем тот самый сектор с диска, обновляем данные в памяти, записываем обновленный сектор обратно на диск. Если условия поиска записи не попадает ни под один индекс - поочередно читаем с диска всю таблицу, проверяем каждую запись на совпадение с условием поиска.
Если хочешь создать новый индекс - поочередно читаем с диска всю таблицу, строим индекс, записываем его на диск.
Самое дорогое - IO с диском. Поэтому и стараются давать кэши побольше, SSD диски побыстрее, индексы поточнее.
Нету никаких "единиц" есть только чтение-запись с диска.
22 мар 21, 01:03    [22298009]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
White Owl

Разница между реляционной и не-реляционной базой на самом деле очень маленькая. И заключается она всего-лишь в том, что в "реляционной" можно определить связи (внешние ключи которые) и сам движок БД будет отслеживать их целостность при изменении данных. А в не-реляционной такой возможности нет, там за целостностью данных надо следить на уровне приложения. И все.

Ну ты даёшь блин. Ну возьми бухгалтерскую учебную бд и втащи ее в не-реляционную с сохранением
целостности денег на транзакциях и отчотах.

Кстати перечисли те системы из класса не-реляционных на которые ты ссылаешся. Тема - это размытая.
Тут - каждый сам себе что-то имеет в виду.
То есть о таких вещах как dBase, FoxPro, Clipper, Clarion ты никогда не слышал и бухгалтерию ты на них никогда не видел, да?
22 мар 21, 01:04    [22298010]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
White Owl

Вот смотри, ты сейчас используешь Кассандру которая хочет держать счетчики в отдельных таблицах и не мешать их с полями другого типа. Это плюшка. А Оракл вообще не имеет счетчиков, нет у него такой плюшки в движке, поэтому ораклисты вынужденны использовать обычное целочисленное поле.

Разве в Оракле я не могу сделать такое?

update table1 set counter = counter + 1;
Можешь. Только это не счетчик получается, а в каждой записи в таблице, увеличиваешь значение в поле counter. Можно, но обычно бессмысленно :)
update table1 set counter = counter + 1 where id=1234;
будет получше слегка :)

mayton
Ровно тоже самое я хотел от Cassandra но она отказала мне в декларации таблиц а вовсе не в реализации этого чудесного DML.
Ну и? Это уникальность Кассандры. Она хочет чтобы твой counter находился в отдельной таблице. Ну так вынеси его.
create table nodes(
 node_id text primary key,
 last_ip text,
 last_port int
);
create table node_counters(
 node_id text primary key,
 pings_requests counter,
 get_peeers_requests counter,
 find_nodes_requests counter
);
В одной таблице описание объекта, в другой счетчики. Причем с точки зрения производительности будет лучше даже не одну таблицу, а три сделать:
create table node_counter_pings(
 node_id text primary key,
 pings_requests counter
);
create table node_counter_peers(
 node_id text primary key,
 get_peeers_requests counter
);
create table node_counter_requests(
 node_id text primary key,
 find_nodes_requests counter
);
Чем меньше таблица в ширину, тем больше записей влезает на одну страницу. И при условии что надо будет обновлять несколько записей подряд - вместо одного IO на каждую запись может получиться один IO на несколько записей. Тут может помочь кластерная индексация, хотя это и не совсем совпадает с твоей текущей задачей.

А работать с этим ты будешь также как и раньше, просто в одну таблицу пихаешь описание ноды, а потом дергаешь счетчики во вторичной таблице.
insert into table_with_info (id, description) values (1234, 'some entity');
update table_with_counter counter = counter+1 where id = 1234;
22 мар 21, 01:20    [22298011]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
White Owl
А в IQ нет нужды делать индексы, там каждое поле автоматически индексировано потому что у БД колоночный метод хранения таблиц - очень тормознуто на обновлениях, но для выборок - конфетка.

А вот с этого момента - поподробнее. Column-oriented это не про индекс а про форму хранения.
Не знаком c IQ но идеология column-oriented это не про обновления а про выборки-агрегации.
Разворот на 90 градусов data-row по сути.

Хотя может мы о разных вещах говорим?
Нет, все правильно. Просто колоночные БД хранят (могут хранить) данные в одно-полевых индексах. Для пользователя они практически не видны, и даже не всегда этим можно вручную управлять, но внутри файл базы данных может состоять целиком из индексов.
22 мар 21, 01:32    [22298012]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
White Owl

С другой стороны, я сейчас работаю с nosql базой (разработанной в начале 80-х), совершенно другой язык запросов, таблицы называют файлами и хранят структуру таблиц во внешних текстовых файлах... Но при этом весь доступ к БД организован через одну единственную билиотеку, которая читает те текстовые файлы и самостоятельно следит за целостностью ссылок. Так что несмотря на то что это "библиотека" - на практике получается классический embedded rdbms. При этом она считается и описывается как nosql, потом что там нет вообще ни грамма от sql :) Там конечно тоже не мало странностей и идиотизмов (в первую очередь из-за "встроенности" с которой надо уметь работать), но...

Что это за волшебная библиотека если не секрет? Я сейчас выпил два по 0.5 светлого и очень сентиментален
и уже готов взять в объятия это чудо и полюбить его крепче чем Oracle в БД и Erlang в отказоустойчивых системах.
Она называется DBIO :)
И нет, это не шутка, она действительно так называется :)
22 мар 21, 01:34    [22298013]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2242
mayton,

ФС как база данных.

Сценарии, когда такое прокатит и всё такое.

Сообщение было отредактировано: 22 мар 21, 06:21
22 мар 21, 06:28    [22298023]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl
mayton
пропущено...

Ну ты даёшь блин. Ну возьми бухгалтерскую учебную бд и втащи ее в не-реляционную с сохранением
целостности денег на транзакциях и отчотах.

Кстати перечисли те системы из класса не-реляционных на которые ты ссылаешся. Тема - это размытая.
Тут - каждый сам себе что-то имеет в виду.
То есть о таких вещах как dBase, FoxPro, Clipper, Clarion ты никогда не слышал и бухгалтерию ты на них никогда не видел, да?

dBase видел. Мы грузили с него телефонный трафик в Oracle.

Бухгалтерию не видел. Мы как раз смигрировали с одной старой dbf-системы на Парус предприятие.
22 мар 21, 11:17    [22298109]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
White Owl

create table node_counter_pings(
 node_id text primary key,
 pings_requests counter
);
create table node_counter_peers(
 node_id text primary key,
 get_peeers_requests counter
);
create table node_counter_requests(
 node_id text primary key,
 find_nodes_requests counter
);
Чем меньше таблица в ширину, тем больше записей влезает на одну страницу. И при условии что надо будет обновлять несколько записей подряд - вместо одного IO на каждую запись может получиться один IO на несколько записей. Тут может помочь кластерная индексация, хотя это и не совсем совпадает с твоей текущей задачей.

Не могу согласится с таким разбиением. В инженерных задачах - эстетика тоже важна.
А я - большой эстет.

Я не ставлю себе задачей - суждать физический размер data-row. Эта цель - специфична для
bigdata - технологий. И оптимизация попаданий в кеш-линию мне тоже не нужна пока.
Мне важнее то насколько удобно я буду видеть статистику реквестов по нодам. Тем более
что они связны. Если нода сделала ping. То следующим реквестом оа запросит список
известных пиров или другиг нодов. Корреляция выходит. И зачем мне тогда таблицы
нарезанные узкими полосками? Тут самое толстое поле - это первичный ключ. Разумнее
склеивать.
22 мар 21, 11:22    [22298113]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton,

А разве сам движок БД не мог бы размещать столбцы по отдельности, если в
определённых ситуациях это производительнее? Потому что размещать атрибуты в
отдельных таблицах — это беспредел.
22 мар 21, 11:31    [22298122]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
petrav
mayton,

А разве сам движок БД не мог бы размещать столбцы по отдельности, если в
определённых ситуациях это производительнее? Потому что размещать атрибуты в
отдельных таблицах — это беспредел.

Apache ORC и Parquet так и делают. Но это не движки DBMS. А движки неких замороженных снимков
данных для аналитики. Обычно они - исторические. По сути это форматы бинарного хранения больших
данных. Даижком это назвать вряд-ли можно.
22 мар 21, 11:56    [22298145]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
didgik
mayton, интересует запрет повторного запуска проги той же папки. Из другой можно. Главный вопрос - активировать прогу уже запущенную из этой папки.


Очень просто же, вешаешь мьютекс именованый глобальный, если создал -- ты первый. Если мьютекс уже был создан -- приложение уже было запущено, и ты завершаешься.

Либо также можно глобальный атом делать, либо другой любой именованый объект межпроцессного взаимодействия.
(в линуксах для этого используют часто реальные файлы в файловой системе)
22 мар 21, 12:18    [22298155]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Нужны какие то тесты что ли....
Показывающие что "вот схема классик и бд не справляется" = наличие проблемы.
А вот схема заточенная на решение проблемы.
Ну а по теории, строят Логическую и Физическую схему.
В логической бизнес. В физической ключи, отношения, типы и последовательности.
22 мар 21, 12:23    [22298162]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
PetroNotC Sharp
mayton,
Нужны какие то тесты что ли....
Показывающие что "вот схема классик и бд не справляется" = наличие проблемы.
А вот схема заточенная на решение проблемы.
Ну а по теории, строят Логическую и Физическую схему.
В логической бизнес. В физической ключи, отношения, типы и последовательности.

Нет-нет. Нету пока никаких тестов. И нету проблемы. Есть просто вопрос эстетики.
Мне не нравится когда таблица порезана на 3 вертикальных полоски просто так.
В угоду идеям перформанса. Я не знаю какова должна быть просадка перформанса
(явно больше 1000%) чтоб я начал думать о порезании таблич на куски.

Да и не ставлю я пока таких вопросов. Давайте поскипаем эту тему. Я подниму
ее чуть позже в Программировании в разрезе самого сетевого протокола.
22 мар 21, 12:57    [22298187]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Полоски это партицирование?
>поскипаем
= ОК
22 мар 21, 13:23    [22298195]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
Вообще мне всегда казалось, что NoSQL был рождён из-за недостатков SQL. Проблема реляционных
баз данных в плохой масштабируемости. Когда возникает big data и тебе нужны десятки тысяч серверов
БД по всей планете, то SQL не справляется. Да, NoSQL не гарантирует связанности данных, но мы ей
жертвуем, что бы юзер хотя бы что-то мог найти в нашей распределённой БД.

Но в данном диалоге прослеживаются такие нотки, что мол вообще можно/нужно использовать NoSQL
просто повсеместно. Просто потому что это модно и молодёжно.
22 мар 21, 13:31    [22298201]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Вообще мне всегда казалось, что NoSQL был рождён из-за недостатков SQL.

Да, но не тех, о которых ты говоришь. Когда очередной энтузазист делает свою собственную
СУБД с покером - он не осиливает полный парсер и оптимизатор SQL поэтому выкидывает его и
преподносит прямой доступ к внутренним структурам и функциям как достоинство. STFW FwMas.

Posted via ActualForum NNTP Server 1.5

22 мар 21, 13:45    [22298208]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
По поводу поля counter. Я думаю что все просто. Запросы с инкрементом - не идемпотентные. А поскольку
Apache Cassandra гарантирует работу таблиц одной базы в пределах земного шара - то ей нужны внятные механизмы
репликации которые не сломают реплику. Скорее всего такое разделение введено с целью разделить
два протокола. Один - простой для UPDATE .. SET field = value. А другой для UPDATE .. SET field = f(field)
который требует повышенного внимания в дубликатам сетевых собыйтий.
22 мар 21, 16:19    [22298309]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
White Owl
Member

Откуда:
Сообщений: 12682
mayton
Не могу согласится с таким разбиением. В инженерных задачах - эстетика тоже важна.
А я - большой эстет.

Я не ставлю себе задачей - суждать физический размер data-row. Эта цель - специфична для
bigdata - технологий. И оптимизация попаданий в кеш-линию мне тоже не нужна пока.
Мне важнее то насколько удобно я буду видеть статистику реквестов по нодам. Тем более
что они связны. Если нода сделала ping. То следующим реквестом оа запросит список
известных пиров или другиг нодов. Корреляция выходит. И зачем мне тогда таблицы
нарезанные узкими полосками? Тут самое толстое поле - это первичный ключ. Разумнее
склеивать.
Ну так вьюшку поверх накладываешь и все. У Кассандры даже материализванные предстваления есть.
22 мар 21, 16:21    [22298311]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Хм... это мысль. Впрочем я пока думаю выкинуть Кассандру и вернуться к Postgresql. Это был творческий эксперимент.
Он наполовину удался. Я доволен.
22 мар 21, 16:24    [22298313]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
- чтобы гарантировать в пределах земного шара достаточно не совпадения PK. Одно из решений GUID
- при GUID реплика не ломается
22 мар 21, 16:25    [22298315]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton
Хм... это мысль. Впрочем я пока думаю выкинуть Кассандру и вернуться к Postgresql. Это был творческий эксперимент.
Он наполовину удался. Я доволен.
итого - "делайте Модель в бд по бизнесу, а не потому что бд так легче"
22 мар 21, 16:27    [22298317]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
PetroNotC Sharp
mayton,
- чтобы гарантировать в пределах земного шара достаточно не совпадения PK. Одно из решений GUID
- при GUID реплика не ломается

Почему?
22 мар 21, 16:32    [22298321]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton
PetroNotC Sharp
mayton,
- чтобы гарантировать в пределах земного шара достаточно не совпадения PK. Одно из решений GUID
- при GUID реплика не ломается

Почему?

Вопрос на второе утверждение или на первое?
Я делал реплику руками. Что там должно ломаться?
22 мар 21, 16:36    [22298326]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

PetroNotC Sharp
- чтобы гарантировать в пределах земного шара достаточно не совпадения PK. Одно из решений
GUID

Счётчики в данном случае, насколько я понял, используются совсем не для генерации ПК.

Posted via ActualForum NNTP Server 1.5

22 мар 21, 16:44    [22298329]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
PetroNotC Sharp
mayton
пропущено...

Почему?

Вопрос на второе утверждение или на первое?
Я делал реплику руками. Что там должно ломаться?

Ты не мог делать реплику "руками". Репликация в распределённых БД
это не одноразовое админское действие. Это вечный процесс. Однажды
начавшись для конфигурации - он никогда не заканчивается. Или закончится
с ре-конфигурацией.
22 мар 21, 16:46    [22298330]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Вот нет логики в твоей фразе.
Почему я не мог делать репликацию "вечно"?
22 мар 21, 16:59    [22298338]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
AmKad
Member

Откуда:
Сообщений: 5260
PetroNotC Sharp

Почему я не мог делать репликацию "вечно"?
Ну почему же не мог. Мог. Вечно. Руками
22 мар 21, 17:01    [22298339]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov,
Я тоже понял что Не для репликации. Хотел уточнений - для чего же тогда?))
22 мар 21, 17:02    [22298340]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad
PetroNotC Sharp

Почему я не мог делать репликацию "вечно"?
Ну почему же не мог. Мог. Вечно. Руками
))))
В меню юзвери выбирали - синхронизировать с головным
22 мар 21, 17:03    [22298342]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
PetroNotC Sharp, ништяк. Буду к тебе обращаться за консультациями.
22 мар 21, 17:04    [22298344]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad,
Руками программисты (настоящие) называют написание кода без использования либ чужого.
22 мар 21, 17:05    [22298346]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
AmKad
Member

Откуда:
Сообщений: 5260
PetroNotC Sharp
В меню юзвери выбирали - синхронизировать с головным
Вот это идея! Все, что у меня на шедулер повешено, юзерам передам - пусть дергают по расписанию.
22 мар 21, 17:05    [22298347]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
AmKad
Member

Откуда:
Сообщений: 5260
PetroNotC Sharp
AmKad,
Руками программисты (настоящие) называют написание кода без использования либ чужого.
А я наоборот, как правило, код пишу, чтобы руками что-то не делать. Видимо, потому что я не настоящий.
22 мар 21, 17:07    [22298349]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad
PetroNotC Sharp
В меню юзвери выбирали - синхронизировать с головным
Вот это идея! Все, что у меня на шедулер повешено, юзерам передам - пусть дергают по расписанию.
только в том случае, если ты кроме штатной репликации из коробки не умеешь писать код руками.
22 мар 21, 17:09    [22298351]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad,
Наверно не настоящий прогер. В оракле не на всех версиях есть штатная.
22 мар 21, 17:12    [22298355]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
AmKad
Member

Откуда:
Сообщений: 5260
PetroNotC Sharp,

Самописная репликация, процессы которой инициируются без участия бизнес-пользователя - недостижимый идеал?
22 мар 21, 17:24    [22298362]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad,
Можно и так. Это ты просто прицепился к слову "руками".
22 мар 21, 17:44    [22298381]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
AmKad
Member

Откуда:
Сообщений: 5260
PetroNotC Sharp
Можно и так. Это ты просто прицепился к слову "руками".
Не обижайтесь на меня. Я любитель потроллить, но я не со зла. А зацепился я не просто за "руками", а за пару "руками" + "вечно".
22 мар 21, 18:03    [22298397]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

PetroNotC Sharp
Хотел уточнений - для чего же тогда?))

Внезапно, счётчики способны использоваться в качестве счётчиков. В данном случае - пакетов
DHT. В этом случае с их репликацией нет проблем.

Posted via ActualForum NNTP Server 1.5

22 мар 21, 18:22    [22298414]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
AmKad,
)
Вы правы. Слово вечно тоже было. Оно было от ТС и такое вкусное что я тоже не мог пройти мимо)
22 мар 21, 18:41    [22298425]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov
PetroNotC Sharp
Хотел уточнений - для чего же тогда?))

Внезапно, счётчики способны использоваться в качестве счётчиков. В данном случае - пакетов
DHT. В этом случае с их репликацией нет проблем.
ну вот эта связь как раз от меня ускользает.
Это же транспортный уровень? Пакеты считать?
22 мар 21, 18:43    [22298428]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

PetroNotC Sharp
Это же транспортный уровень? Пакеты считать?

Это прикладная задача.

Posted via ActualForum NNTP Server 1.5

22 мар 21, 19:04    [22298438]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov,
Я поднял руки к верху.
Не понял моделирования и модели данных для прикладной.
Удачи!
22 мар 21, 19:09    [22298441]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Давайте в тему сетевых пакетов. Вот это "ухо" я написал для экспериментов.

+

Также отсылки были здесь
https://www.sql.ru/forum/1334409/tshark-bencode
https://www.sql.ru/forum/1226202-2/bt-novyy-open-souce-freymvork-dlya-bittorrent?hl=mayton dht


# UDP dht port snitch. 
#   2021/03/21 - mayton : In beginning

import socket
import bencodepy
import binascii

UDP_IP = "0.0.0.0"
UDP_PORT = 51413

sock = socket.socket(socket.AF_INET, # Internet
                    socket.SOCK_DGRAM) # UDP

sock.bind((UDP_IP, UDP_PORT))

print("Listening ip = ", UDP_IP, " port = ", UDP_PORT)

while True:
    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
    try:
       print("Decoded UDP content is : " , bencodepy.decode(data))
    except bencodepy.exceptions.DecodingError as e:
       print("Exception", e.__class__, " Unable to decode UDP data : " ,  binascii.hexlify(data))


Ухо слушает входящие запросы типа ping, find_node e.t.c. и печатает на скрин.

Вот то что декодировалось успешно - содержит node_id.

Listening ip =  0.0.0.0  port =  51413
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'41001b0e1af1018200000000001000007f770000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'41001b0e1b21aeb500000000001000007f770000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'41001b0e1b7d7deb00000000001000007f770000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100849c35b7c15900000000001000001b800000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100849c35ec987e00000000001000001b800000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100849c364910fd00000000001000001b800000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100daa0527fc16c0000000000100000e2450000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100daa052b23c8c0000000000100000e2450000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100daa0530e38ed0000000000100000e2450000'
Decoded UDP content is :  OrderedDict([(b'a', OrderedDict([(b'id', b'A;\x16\x81m\xbb\xce\x9a\xf4\x98)\xd7\xbay/R\x9e\x9d\xc7]'), (b'info_hash', b'A;(\xfe,3\xc0\x18+\x14\xcf\xa8k\xed8\x98\xd7]\xee\xa1')])), (b'q', b'get_peers'), (b't', b'\xd0<'), (b'v', b'LT\x01,'), (b'y', b'q')])
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100ce3487abec2400000000000000002a8a0000'
Decoded UDP content is :  OrderedDict([(b'a', OrderedDict([(b'id', b'{\xc3\xa7\xd6\xaeR\x90I\xf1\xf1\xbb\xe9\xeb\xb3\xa6\xdb<\x87\x0c\xe1'), (b'target', b'{\xc3\xa7\xd6\xaeR\x90I\xf1\xf1\xbb\xe9\xeb\xb3\xa6\xdb<\x87\x0c\xe1')])), (b'q', b'find_node'), (b't', b'\x82#\x00\x00'), (b'v', b'UT\xb3\x8e'), (b'y', b'q')])
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100d456729737850000000000100000e1790000'
Exception <class 'bencodepy.exceptions.DecodingError'>  Unable to decode UDP data :  b'4100d45672c837960000000000100000e1790000'

Обратите внимание на запросы get_peers, find_node.

Кто тут есть Питонщики. Посмотрите code-review где я чего неправильно написал.

Вот в этих декодированых сообщениях и читается модель тех данных которую я пытался впихнуть в Cassandra.
Это к вопросу о доменной области. Вот. Смотрите. Вот она. Доменная область.

И вот спека которую я начал читать http://www.bittorrent.org/beps/bep_0005.html
22 мар 21, 20:00    [22298466]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton,

А почему используется UDP, а не TCP ?
22 мар 21, 21:25    [22298487]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Это не моё решение. Так было задумано. Это-ж типа протокол discovery. Поиска узлов. Как dns. И данных.
А их тыщи. И к каждому из них сокет создавать - накладно. А тут как dns. Пинганул. Че-то спросил и
никаких больше обязательств.

Там постоянное нужно только на последней фазе. Когда уже есть peer и он владеет каким-то файлом который надо качать.
Вот там уже лучше идёт tcp.
22 мар 21, 21:46    [22298493]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
mayton

UDP_IP = "0.0.0.0"
UDP_PORT = 51413

Исходник рабочий. Но чтобы почувствовать движняк входящих запросов - надо попробовать поиграть
с разными номерами портов. Я таковых насобирал вот столько. Здесь число - это номер порта который надо
слушать.

        return new DhtListener("Vuze", 16680, "VZ1");
        return new DhtListener("Vuze", 49001, "VZ2");
        return new DhtListener("A-Mule", 4665, "AM1");
        return new DhtListener("A-Mule", 4672, "AM2");
        return new DhtListener("Transm", 51413, "TR1");
        return new DhtListener("Transm", 48529, "TR3");



И перед запуском тулы желательно запустить любой из dht-клиентов минут на 5. Он начнет пинговать соседей.
Прогреет себя. И потом уже соседи будут пинговать вас.

И не забудьте на роутере разрешить порт-маппинг даннх портов из внешнего интернета на свой текущий LAN IP.
22 мар 21, 21:50    [22298495]     Ответить | Цитировать Сообщить модератору
 Re: С пятницей всех.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Подсобирал еще сведений.

Пока от Кассандры не избавился но уже написал адаптеры этой-же логики персистенса под Postgres.

Сведенья по нодам и хостам
cqlsh:dhtspace> select * from nodes_hosts;
 node_id                                  | last_city      | last_country | last_ip_port          | last_update_time
------------------------------------------+----------------+--------------+-----------------------+---------------------------------
 784b44b6206e95b8b94c1693a10cc676d874dd5f |     Athis-mons |           FR |                  null |                            null
 3c39806347e45e6990352a0fbf84e61f068d70ce |           null |         null |  222.178.154.4*:51413 | 2021-03-23 19:46:12.317000+0000
 a1ecaa49f1f1bbe9ebb3a6db3c870c3e99245e52 |       Budapest |           HU |    94.45.212.6*:51413 | 2021-03-23 21:03:34.206000+0000
 70924b98bdf323e17a9d0b6870fee6e5130ee382 |     Warrington |           GB |                  null |                            null
 ca83e509f1b2b7c18500eef88937bd6adb8e1396 |            Ise |           JP |    61.239.33.2*:51413 | 2021-03-23 19:45:57.443000+0000
 1276e9861ddeb801736c2ea9966b9a75b825f57d |      Bucharest |           RO |                  null |                            null
 8b2a3e41c730d40abeb5641722eb7ad36bdcbc87 |                |           CN |                  null |                            null
 f8a497f239b28f9075fbfabaf3cfd17b1d41edcc |           null |         null |   195.191.58.2*:51413 | 2021-03-23 19:45:51.018000+0000
 c1e9734240f8e83b8caf344acbeec3f6f8138d2d |       Bistrita |           RO |   83.209.166.1*:51413 | 2021-03-23 19:46:54.263000+0000
 855276e6ab5dbd05f4cee47eb591391b0e1817bb |           null |           US | 178.122.233.23*:51413 | 2021-03-23 19:39:38.585000+0000

Счетчики
cqlsh:dhtspace> select * from nodes_stats;

 node_id                                  | announce_requests | find_nodes_requests | get_peeers_requests | pings_requests
------------------------------------------+-------------------+---------------------+---------------------+----------------
 3dbc6b46b16c7df14c05aea98772504762ff9012 |              null |                   1 |                null |           null
 357d8d96ffa9a99e0f3de34f22cf0a89a8e22096 |              null |                   1 |                null |           null
 c3c6729110e3a259bef55abbc6fbe8517659bae5 |              null |                  86 |                null |           null
 784b44b6206e95b8b94c1693a10cc676d874dd5f |              null |                null |                null |              2
 7f3063c9966f1828b4bef0ac1cb479c38228e206 |              null |                null |                null |              3
 caea8d4917db7895520d7815924ef12ef947bfdd |              null |                   1 |                null |           null
 2b92d5599b2149b105fe3f652014d7f3172c6c62 |              null |                null |                null |              5
 c3c67ad6ae529049f1f1bbe9ebb3a6db3c870ce1 |              null |                   4 |                null |           null
 c3feeac409ae93d7de42e01cd54f1a7eb8cc7732 |              null |                   1 |                null |           null


Сведенья по поисковым операциям я еще не обрабатываю

Наблюдения.

1) События класса announce_peer - самые редкие.
2) По прежнему примерно четверть всего трафика не поддается дешифровке хотя очевидно что это bencode
проткол только с offset-ом. Это всё таки Distributed Hash только формируется другим приложением я так думаю.

 $ /dht-observer/out$ du -h
11M	./decoded
3.9M	./non-decoded
15M	


3) Я не могу себя проверить. Как убедится что на реквест get_peers я вернул корректный результат?
Тоесть как другие участники сети могут сообщить мне что я - флудер или формирую ответы не по протоколу?

4)Как понять в каком формате ожидаются ответы о peers? Nodes?

Вот семпл из документации.

get_peers Query = {"t":"aa", "y":"q", "q":"get_peers", "a": {"id":"abcdefghij0123456789", "info_hash":"mnopqrstuvwxyz123456"}}
bencoded = d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz123456e1:q9:get_peers1:t2:aa1:y1:qe

Response with peers = {"t":"aa", "y":"r", "r": {"id":"abcdefghij0123456789", "token":"aoeusnth", "values": ["axje.u", "idhtnm"]}}
bencoded = d1:rd2:id20:abcdefghij01234567895:token8:aoeusnth6:valuesl6:axje.u6:idhtnmee1:t2:aa1:y1:re


5) Что это? "values": ["axje.u", "idhtnm"] ? Имена в формате domain-names? Если у меня их нет. Можно ли толкать IPv4 адреса?

6) Что мне делать с токеном? Я его сам генерю? Или возвращаю как кукис?

7) Как работает роутинг в DHT? Они пишут

In Kademlia, the distance metric is XOR and the result is interpreted as an unsigned 
integer. distance(A,B) = |A xor B| Smaller values are closer.

Тоесть я должен вычислять сложение по модулю 2 и искать соседей у которых id по метрике ближе к моему искомому?

8) Как лимитировать свой трафик? Сколько раз я могу долбануть UDP пакетом по соседу? Так чтобы не попасть во временный
троттл или бан. Из опыта знаю что если не ставить ограничители на send_udp то можно даже свою сеть повалить.
Это конечно маловероятно но если я буду просто циклиться или ошибаться в алгоритме роута то я буду эдаким
UDP-флудером.
24 мар 21, 00:21    [22299182]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
Все форумы / C++ Ответить