@dlangru

Страница 258 из 719
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
Дмитрий говорил что у него свой парсер потому что там ему надо было какие-то кастомные ссылки в него вставить, я вот не уверен что это хорошо. Имхо лучше взять самый стандартный парсер и сделать все на нем.

Google
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
тут расчет нового размера https://github.com/dlang/phobos/blob/master/std/array.d#L3163
А можешь объяснить понятным языком примерно как он рассчитывается. Просто я в код посмотрел и мало что понял Вроде бы тут одна строка выделяет с запасом: ulong mult = 100 + (1000UL) / (bsr(curLen * TSizeOf) + 1); так?

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
Я пользовался. Проблемы все были решены. Сейчас он стабилен
А проблемы типа object.Error@(0): Access Violation есть? Просто сейчас хотел воспользоваться, сначала он не мог найти openssl, я поставил, а теперь просто кидает object.Error@(0): Access Violation и все

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
Переименовывать не надо
Тогда он не видел И да, надо было версию 1.0.2L, она как раз подошла

Спасибо за помощь

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 — это зеленый ВАЗ

а по набору этих классов-билдеров мы будем знать, какие вообще мы можем делать машины

Страница 258 из 719