
Oleg
23.06.2016
14:23:00
это не 2 библиотеки, а скорее phobos есть расширение core

Dmitry
23.06.2016
14:24:27
Тоесть в рантайме corе юзают?

Oleg
23.06.2016
14:24:47
ну рантайм это и есть core по сути

Dmitry
23.06.2016
15:49:47
Что он делает кроме GC?

Google

Oleg
23.06.2016
15:52:48
ну там много чего, открой и посмотри)
исходники всегда более точны, чем информация, которую люди могут запомнить
если хочешь разбираться (в целом) то не ленись читать исходники

Dmitry
23.06.2016
16:02:39
Ок щас до дома доеду гляну

Oleg
25.06.2016
10:37:31
может кому пригодится
auto powerOfTwo = !((x-1)&x);
линейное время, битовая операция — максимально быстрая проверка

Мерлин
25.06.2016
11:57:27
https://habrahabr.ru/post/304072/
https://habrahabr.ru/post/304106/

Oleg
25.06.2016
18:18:27
чёт слабо понимаю чем это координально отличается от std.curl, зачем requests была написана? только чтобы интерфейс python библиотеки скопировать на D?

Dmitry
25.06.2016
18:24:36
Цурл будет помечен как деприкейтет вот вот
Уж очень он ненативный

Oleg
25.06.2016
18:25:34
оп, а откуда такая инфа? в std что-нибудь будет на его замену? reqests, как я понял, не метит в std.experimental

Dmitry
25.06.2016
18:26:15
На форуме тема была про это. Там же эта штука как замена предлагалась

Google

Oleg
25.06.2016
18:31:36
хм...

Eto
25.06.2016
20:00:17

Oleg
25.06.2016
20:08:04
https://habrahabr.ru/post/304072/#comment_9674416
по всей видимости нет

Eto
25.06.2016
20:33:23

Oleg
25.06.2016
20:39:11
ну 2018 это не вот вот

Dmitry
25.06.2016
20:42:20
К тому моменту выкинут. А депрекейтом вроде пометят уже скоро

Oleg
25.06.2016
20:42:40
в 2017

Dmitry
26.06.2016
13:56:44
Ну пол года осталось)
Не так уж и много)

Oleg
26.06.2016
23:34:24
может кого заинтересует
https://code.dlang.org/packages/rc

Dmitry
27.06.2016
05:39:44
Чем от текущего отличается gc? Вроде он тоже ссылки считает

Oleg
27.06.2016
05:40:36
нет
gc в рантайме сканирует память

Dmitry
27.06.2016
05:41:20
А этот как работает?
В рантайме сканирует и как определяет где память освобождать?

Oleg
27.06.2016
05:42:14
если на неё не ведут ссылки из корня
корень это область памяти, доступная из кода
вся память выделяется через GC по умолчанию, поэтому он о всех участках знает
но вот этот stop-the-world это печальная ерунда, если нужна стабильная производительность

Google

Eto
27.06.2016
05:50:41
Есть опыт использования аллокаторов?

Oleg
27.06.2016
05:51:19
+/-
а что интересует?

Eto
27.06.2016
05:55:25
Интересно мнение в контексте данного обсуждения.

Dmitry
27.06.2016
06:19:40
У ГК какая то своя таблица есть где он помечает какая функция где что заняла? Как он понимает что память пора освободить?

Oleg
27.06.2016
06:24:53
GC знает о всей выделенной памяти
есть root память — память, которая доступна из программы
в момент выделения новой памяти GC анализирует необходимость уборки (сколько уже выделено, количество свободной и тд)
если пора собирать мусор, GC начинает сканировать root и переходить по указателям, помечая доступную память
затем он просматривает всю выделенную память и удаляет ту, что не помечена как доступная

Dmitry
27.06.2016
06:38:10
А подсчет ссылок как тогда работает? Он же вроде как медленный

Max
27.06.2016
07:38:20
Вроде же RC в стандартной библиотеке был, или я чего-то недопонял?

Oleg
27.06.2016
07:42:36

Max
27.06.2016
07:43:55
http://dlang.org/phobos/std_typecons.html#.RefCounted

Oleg
27.06.2016
07:45:18
о как

Oleg
27.06.2016
07:45:22
интересно)
но в целом я это делал для эксперимента, а не для результата)

Max
27.06.2016
07:52:11
Хотя там RC как-то странно через GC реализован
https://github.com/dlang/phobos/blob/d42eff4ff877dd154b103e89ee8198bd063ad232/std/typecons.d#L4742

Oleg
27.06.2016
08:16:29
addRange это не добавление в пул слежения за памятью
по сути так правильней делать
саму память GC не манажит, а вот по указателям проходит
тоесть если у тебя будет объект внутри объекта, на который ты ссылки подсчитываешь и он не будет добавлен в отслеживание GC, внутренний объект, если он выделен через GC может быть удалён, потому что GC не будет видеть ссылки на него

Google

Pavel
27.06.2016
14:52:15
Скажите, кто-нибудь шарит в том как с сетевого интерфейса можно слизывать входящие данные параллельно основному потоку?
Если кто-то помнит, то я хотел сделать дублятор трафика, но с самого начала завис :)

Eto
27.06.2016
14:55:00
Открыть сокет и читать из него иногда?

Pavel
27.06.2016
14:55:59
Выглядит как-то слишком просто. А к чему именно открыть сокет?

Олег
27.06.2016
14:56:14
https://ru.wikipedia.org/wiki/Pcap ?

Pavel
27.06.2016
14:56:51
Да, именно типа такого. Но интересна какая-то D специфика, может есть уже готовые инструменты

Олег
27.06.2016
15:02:10
Я не встречал, но я думаю не сложно будет сделать биндинг к libpcap.

0x9d8e
27.06.2016
18:26:42
Народ, видел кто-нибудь либы для пробивания двух NAT'ов? Не важно на каком языке. Когда-то надо было, но думал, что невозможно. Оказалось возможно, да везде только описание принципа. Хочется на это в коде глянуть, да демку запустить.

Ruslan
27.06.2016
18:32:25
да
я делал

Admin
ERROR: S client not available

Ruslan
27.06.2016
18:32:33
в своей
могу объяснить
человеческим языком

0x9d8e
27.06.2016
18:33:19
Буду признателен

Ruslan
27.06.2016
18:33:22
https://github.com/RevenantX/LiteNetLib
вот либа
а человеческим языком
если это UDP hole punching
есть сервер с белым айпи - допустим X
есть два клиента за NAT (важно не симметричным)
первый и второй клиенты шлют на сервер просто собственные IP адресы локальные и порт локальный на котором bind выполнил.
формат данных не важен. Хоть бинарно хоть JSON
сервер получает эти данные и заодно в receive приходит IP и Порт внешний
и рассылает этим клиентам IP другого
тоесть первому клиенту IP второго
а второму наоборот.
Клиенты получают эти данные и подключаются к IP адресам(точнее к паре Адрес:порт) которые выдал сервер
там должно быть две штуки локальный и внешний
готово


0x9d8e
27.06.2016
18:52:34
То есть, допустим, я слушаю на сервере порт, приходит коннект, передаёт нечто в духе "Привет, я zxI49-#35f45yfc4t*&*9ufujh4rUJHKJH3r, пожалуйста, если кто меня спросит, сообщи им мой ip:port.". Я ему "Ок" (ему же самому по идее до фонаря кто он там снаружи?), кладу этот его идентификатор куда-нибудь вместе с таймштампом и ip:port'ом. Приходит другой коннект, говорит "Здоарова, не знаешь ли где zxI49-#35f45yfc4t*&*9ufujh4rUJHKJH3r?" Я ему "Да вот же он: 123.45.67.89:666". Тогда он просто берёт и коннектится к 123.45.67.89:666.
Или они обязательно должны оба друг к другу стучаться? Если tcp надо, то поверх udp?

Google

Мерлин
27.06.2016
18:52:35
Короче вот
https://habrahabr.ru/post/304150/


Ruslan
27.06.2016
18:55:52
не
такая схема работает и через TCP
" Я ему "Да вот же он: "
тут когда сервер получает
он принимает локальный айпи и порт ( на случай если они в одной сетке сидят )
и в сокет на удп (или тцп) приходит внешний айпи и порт
ты второму отправляешь и внешний айпи с портом и внутренний
но просто в случае UDP удобнее иногда (в плане соединения)
То есть, допустим, я слушаю на сервере порт, приходит коннект, передаёт нечто в духе "Привет, я zxI49-#35f45yfc4t*&*9ufujh4rUJHKJH3r, пожалуйста, если кто меня спросит, сообщи им мой ip:port.". Я ему "Ок" (ему же самому по идее до фонаря кто он там снаружи?), кладу этот его идентификатор куда-нибудь вместе с таймштампом и ip:port'ом. Приходит другой коннект, говорит "Здоарова, не знаешь ли где zxI49-#35f45yfc4t*&*9ufujh4rUJHKJH3r?" Я ему "Да вот же он: 123.45.67.89:666". Тогда он просто берёт и коннектится к 123.45.67.89:666.
Или они обязательно должны оба друг к другу стучаться? Если tcp надо, то поверх udp?
но в целом почти да
единственное, что удобней пытаться сразу коннект кидать с обеих сторон
на случай если один из них за симметричным натом
ID по которому они хотят соедениться можно какой угодно придумать
а на этом коннекторе просто в dictionary класть
https://habrahabr.ru/post/304150/
в этой статье 1 лишний шаг
STUN сервер лишний
сигнальный сервер сам это всё и так узнает


0x9d8e
27.06.2016
19:10:21
Ага, то есть первый клиент (который хочет "сервером" быть) стучится ко внешнему серверу, вышеупомянутым образом, сервер его запоминает, закрывает соедиенение. Первый клиент открывает через тот-же порт, через который стучался к серверу сокет и начинает слушать. Второй клиент получает от сервера ip:port и коннектится туда. Так? А в случае с UDP можно ещё сразу с двух сторон. Может ещё для подтверждения сервер через небольшой промежуток времени сам попытаться подключиться к первому клиенту и в случае успеха сообщить ему, что всё у него прекрасно (а тот по таймауту бить тревогу, мол "не могу быть сервером, сделайте что-нибудь").
Правильно я понимаю?


Ruslan
27.06.2016
19:13:38
в целом да
просто в случае UDP они оба пытаются подрубиться к друг-другу
и там нет понятия клиент/сервер.
Хотя поидее так можно и в TCP
если им например в течении 10 секунд не удалось таким образом установить соединение
то дропать эту процедуру
Может ещё для подтверждения сервер через небольшой промежуток времени сам попытаться подключиться к первому клиенту и в случае успеха сообщить ему, что всё у него прекрасно (а тот по таймауту бить тревогу, мол "не могу быть сервером, сделайте что-нибудь").