
Pavel
06.09.2017
09:15:24
> будет создавать и возвращать класс того или иного типа в зависимости от определенного условия.
Ну формально конечно тут ошибка, создается объект класса а не класс. Но вообще класс и объект это настолько базовые и простые понятия в ООП что ни у кого с ними путаницы возникать не должно имхо.
Даже если их употребляют в неправильном контексте, обычно всегда видно что к чему.

Dmitry
06.09.2017
09:26:46
Вообще в коде на Ди вы часто паттерны используете типичные для .NET?

Pavel
06.09.2017
09:27:31
У дотнета нету типичных паттернов, кроме linq )

Google

Dmitry
06.09.2017
09:28:40
Ну как я понимаю кучу паттернов из NET для того что Python не применимы. Возникает вопрос а для Ди они нужны? Для реальных проектов

Maxim
06.09.2017
09:28:59
в дотнете очень любят использовать ambient context

Dmitry
06.09.2017
09:29:05
это что?

Maxim
06.09.2017
09:29:57
разновидность внедрения зависимостей
грубо говоря, когда нужные объекты передаются не через переменные конструктора, а через вызовы статических методов классов
т.е. если мы привыкли, например, передавать инстанс логера через конструктор auto foo = new Foo(logger);, то в ambient context на этапе создания ничего не передается, а где-то внутри Foo есть вызов Logger.getInstance(), который возвращает какой-то инстанс логера
для инфраструктурных вещей вполне подходящий и изящный паттерн, но в бизнес-логике лучше его не использовать

Dmitry
06.09.2017
10:20:21
К теме про склейку массивов цитата:
"Appender's local capacity storage will give you a pretty big boost "
Получается у Аппендера есть какой-то буфер в отличие от ~ ?

Maxim
06.09.2017
10:22:33
у ~ тоже буфер есть

Dmitry
06.09.2017
10:22:46
чему он равен?

Maxim
06.09.2017
10:23:01
ахз, подозреваю, зависит от компилятора

Dmitry
06.09.2017
10:23:20
а разница тогда с аппендером в чем?

Maxim
06.09.2017
10:23:26
вернее, не буфер там, а зарезервированная память

Google

Dmitry
06.09.2017
10:23:42
а резервируется сколько? хотя бы примерно

Maxim
06.09.2017
10:23:43
а где аппендер описан? сейчас посмотрим)

Dmitry
06.09.2017
10:24:05
https://dlang.org/library/std/array/appender.html

Maxim
06.09.2017
10:25:39
эх, как же я не люблю в стандартной библиотеке ковыряться, там местами настоящая вакханалия творится
перед самим аппендером такой вот комментарий
/**
Implements an output range that appends data to an array. This is
recommended over $(D array ~= data) when appending many elements because it is more
efficient. Appender maintains its own array metadata locally, so it can avoid
global locking for each append where $(LREF capacity) is non-zero.
See_Also: $(LREF appender)
*/
что там внутри, я сходу сейчас разобраться не смогу)

Andrey
06.09.2017
11:09:46
обычная конкатенация юзает апи сборщика мусора (рантайм) для проверки ёмкости массива, и оно блокировки использует. А аппендер локально хранит ёмкость, и по-этому быстрее работает

Maxim
06.09.2017
11:15:32
не, по принципу действия больше похоже на узкоспециализированный service locator

Dmitry
06.09.2017
11:32:28
Локально - где то в своей структуре статической? И емкость чего именно? Количество элементов которые склеивают с их размером?

Maxim
06.09.2017
11:35:28
у динамических массивов в D есть так называемая емкость: например, делаешь ты массив из двух элементов, а D под это дело резервирует память, которой хватит на 10, и вот пока ты не добавишь 10 элементов, GC вызываться не будет
вот за этой самой емкостью appender следит лично каким-то изощренным способом)

Andrey
06.09.2017
11:51:54
просто хранит size_t capacity; в структуре
https://github.com/dlang/phobos/blob/master/std/array.d#L2801

Maxim
06.09.2017
12:00:02
ну это ясно, а какой там алгоритм вообще? я, что-то, с наскока вот так вот потерялся в мешанине)

Oleg
06.09.2017
12:45:53
@DmitryBubnenkov
помнится ты искал способ парсить markdown
https://github.com/PhilippeSigaud/Pegged/wiki/Using-the-Parse-Tree
здесь схожая ситуация: wiki -> latex

Pavel
06.09.2017
12:51:52
Дмитрий говорил что у него свой парсер потому что там ему надо было какие-то кастомные ссылки в него вставить, я вот не уверен что это хорошо. Имхо лучше взять самый стандартный парсер и сделать все на нем.

Oleg
06.09.2017
13:07:03

Google

Dmitry
06.09.2017
13:17:29

Andrey
06.09.2017
13:25:13
зато амортизированное константное время на добавление в конец
тут расчет нового размера https://github.com/dlang/phobos/blob/master/std/array.d#L3163

Pavel
06.09.2017
17:49:21
Блин уже вечер среды а я даже не начинал писать статью

qwerty
06.09.2017
17:51:32
?

Dmitry
06.09.2017
18:06:00

Andrey
06.09.2017
18:32:43
тут хитро расчитывается коеффициент, на маленьких числах получается 2, на бесконечности ближе к 1
тут всё домножено на 100
я в своем коде тупо умножаю на 2, что конечно не так еффективно на больших массивах

Dmitry
06.09.2017
18:51:24
т.е. если я выделяю
str = "a"
то для него выделяется памяти в два раза больше?

Dmitry
06.09.2017
18:57:18
Не в два. :) Минимум 16 байт.
(когда в куче выделяется. просто str="a" вроде не аллоцирует ничего, эта строковая константа уже лежит в сегменте данных)

Dmitry
06.09.2017
19:00:37
а если два символа то?
и что будет если "а" склеить с "b" ?

Dmitry
06.09.2017
19:02:13
тогда аллокация. GC минимально 16 байт аллоцирует, потом 32, 64 .. 4096. Потом уже более хитро выбирается размер для роста массива.

NullSanya
07.09.2017
03:04:04
Всем привет, кто нибудь requests использовал под windows? Были ли какие то проблемы?

Dmitry
07.09.2017
03:16:42
Я пользовался. Проблемы все были решены. Сейчас он стабилен

NullSanya
07.09.2017
03:18:34

Dmitry
07.09.2017
03:19:09
Он без опенссл умеет. Вчера проверял.
Если тебе https не нужен конечно

Google

Dmitry
07.09.2017
03:19:49
Если нужен под виндой openssl.dll нужен только
У тебя версия 0.5.2?

NullSanya
07.09.2017
03:20:48

Dmitry
07.09.2017
03:21:16
ОС какая?

NullSanya
07.09.2017
03:21:35
windows 10 x64

Dmitry
07.09.2017
03:22:06
А либу опенссл откуда брал? Наверно версия какая то старая
Попробуй пока просто без нее
Там пример есть у автора который загружает какой то png файл.
Прям еготскопипасти и проверь. Без лишних либ

NullSanya
07.09.2017
03:24:16
Работает

Admin
ERROR: S client not available

NullSanya
07.09.2017
03:24:26
я самый первый пример взял

Dmitry
07.09.2017
03:26:33
Теперь тоже самое сделай опенссл туда подсунув

NullSanya
07.09.2017
03:27:33
НЕ упало
Хотя в самом начале проскакивает, что он не загружен
Хотя он там есть

Dmitry
07.09.2017
03:29:03
Подсказка так и задумывалась. Имя файла какое?

NullSanya
07.09.2017
03:29:03
Ща подсунул другой, ругается на EVP_md2, типо процедура не найдена

Dmitry
07.09.2017
03:29:37
Не то. Та openssl.dll должна называться

Google

Dmitry
07.09.2017
03:30:15
Скачай пакет с опенссл и там ее возьми
Если вдруг что пни меня через 2 часа. Я тебе свою версию отправлю

NullSanya
07.09.2017
03:32:25
Ну получается качаю отсюда(https://slproweb.com/products/Win32OpenSSL.html), потом беру оттуда libssl-1_1.dll и libcrypto-1_1.dll переименовываю в libssl32.dll и оно падает с вот той ошибкой
И все
без libcrypto оно говорит что не загруженно libssl
Все, подобрал нужные

Dmitry
07.09.2017
04:10:45
Переименовывать не надо

NullSanya
07.09.2017
04:11:54
Спасибо за помощь

Dmitry
07.09.2017
09:53:39
В Ди для паттерна Builder где нужно return this делать?
class CarBuilder
{
string model;
int speed;
string color;
this(string model, int speed, string color)
{
this.model = model;
this.speed = speed;
this.color = color;
}
}
или нужно так делать?
CarBuilder buildModel(string model)
{
this.model = model;
return this;
}

Maxim
07.09.2017
09:58:13
это вообще что-то на builder не похоже)

Dmitry
07.09.2017
09:59:47
пока как-то так получается http://paste.code123.org/8a714bd1-4c8d

Maxim
07.09.2017
10:00:08
я так понимаю, builder — это класс или функция, которая по входному параметру создает некий класс, через сеттеры устанавливает параметры класса и возвращает его

Dmitry
07.09.2017
10:03:37
угу, тока пока реальный, а не притянутый за ушы кейс не вижу

Maxim
07.09.2017
10:04:53
когда у тебя появляются в проекте объекты ебанистических (пардон за мой французский) размеров, возникает мысль разделить между собой конструирование объекта и использование
особенно, когда параметров объекта много, но их комбинаций ограниченное количество
например, есть у тебя машины: они могут быть разных производителей (ВАЗ, БМВ, Шевроле), разных типоразмеров (седан, лифтбэк, кроссовер) и разных цветов
билдер позволит тебе в бизнес-логике создавать объекты примерно таким способом «верни-ка мне седан БМВ красного цвета»
и RedBMWSedanBuilder берет на себя эту задачу
таким образом, во-первых в бизнес-логике мы сразу будем понимать, что RedBMWSedanBuilder — красная БМВ, а GreenVAZLiftbackBuilder — это зеленый ВАЗ
а по набору этих классов-билдеров мы будем знать, какие вообще мы можем делать машины