
Oleg
22.08.2016
14:47:48
ну если для 80 есть 8080, то для 443 должен быть тоже какой-то?

Pavel
22.08.2016
14:48:22
Это же все в рамках общественных соглашений, я использую 10443

Макс
22.08.2016
15:11:45

Pavel
22.08.2016
15:12:10
Ну да, лучше nginx поставить впереди конечно)

Google

Oleg
22.08.2016
15:12:38
да и тут проблемка задалась какая-то
не всегда он нормально перекидывает
это на данный момент api сервис, возможно тонкий клиент на десктоп, возможно веб

Pavel
22.08.2016
15:13:28
Вот, как раз повод поставить nginx) Там он все делает "нативно"
делаешь два виртуал хоста, один слушает 80 порт и редиректит на второй. Второй слушает 443 порт, отдает crt сертификаты и все такое, и проксирует к vibe.d приложению.

Макс
22.08.2016
15:17:20
Плюс есть некое неуверенное ощущение, что HTTPS это что-то связанное больше с конкретным деплоем, чем с логикой, а потому уместнее выглядит, когда настроено в конфиге сервера, а не в коде. Но это мои личные душевные переживания, у других всё может быть наоборот)

Dmitry
23.08.2016
06:06:25
Я когда-то давно спрашивал, почему в доках пишут char[] вместо string. Там какой-то глубокий смысл есть? Или просто исходя из того, что строка это массив символов?

Oleg
23.08.2016
06:30:45
string это не char[], а immutable(char)[]
Просто alias
Нет типа данных string в языке

Dmitry
23.08.2016
06:32:28
погоди, если строка не изменяемый тип, то все операции что получается через копирование происходят?
вот мне нужно сделать срез строки размером 10 байт, до 5. Могу я именно последние 5 байт откусить, а не просто указатель сместить так, что будут видны 1..5 ?

Google

Nick
23.08.2016
07:09:19
http://dlang.org/phobos/std_regex.html
звиняюсь - телеграм ступил

Мерлин
23.08.2016
07:11:47

Dmitry
23.08.2016
07:28:21
toArray имеешь ввиду?

qwe
23.08.2016
07:28:43
погоди, если строка не изменяемый тип, то все операции что получается через копирование происходят?
ну не все. Наверное, только конкатенация. Которая по сути — добавление в массив новых элементов. Это такой динамический массив. А как добавление элементов в массив без копирования в более просторный участок памяти? Знатоки меня поправят. Но операцию append в C я делал именно так. Если массив выходил за рамки отведенной ему памяти, он копировался в участок, где ее в 2 раза больше. Полагаю, capacity в slice как раз и показывает сколько памяти slice может занять до того момента, как его переместят в другое место.

Dmitry
23.08.2016
07:29:58
Э.... по идее менеджер памяти если в пределах данной страницы есть место может без операции копирования обойтись? Верно рассуждаю? Там же страницы по 4КБ

Мерлин
23.08.2016
07:31:31
Хотя там немного хитрее, конечно

Dmitry
23.08.2016
07:32:03
неизменность строк зачем сделана?

Мерлин
23.08.2016
07:33:59

Dmitry
23.08.2016
07:45:48
Олег, я тут застрял с перенаправлением ввода-вывода

Oleg
23.08.2016
07:45:59
что конкретно не так?

Dmitry
23.08.2016
07:47:01
щас покажу что нужно:
http://stackoverflow.com/questions/39094806/how-to-pass-data-to-console-app-and-handle-its-output
у меня максимум получется запустить утилиту, которая будет работать на прием данные как readln и потом по ктрл-с при выходе данные напечатает

Oleg
23.08.2016
07:53:29
хотя блин)

Dmitry
23.08.2016
07:53:48
@deviator ок пасибо

Oleg
23.08.2016
07:53:55
ты же даже pipe.stdin не юзаешь)
1 мин

Dmitry
23.08.2016
07:54:17
а что он делает можешь словами объяснить?
а то доки это хорошо, но краткая суть лучше

Google

Oleg
23.08.2016
08:07:45
хм
чёт не работает как я думал

Dmitry
23.08.2016
08:09:11
во-во

Oleg
23.08.2016
08:10:04
что делает эта функция: запускает процесс и подсовывает ему 3 файла стандартных, ты их можешь пользовать из вызывающей программы
аа
понял
но достаточно странно
сейчас скину код

Dmitry
23.08.2016
08:12:28
давай

Oleg
23.08.2016
08:14:21
простая программа (типа gdal)
import std.stdio;
import std.string;
void main(string[] args)
{
writeln("hello");
stderr.writeln("direct to stderr");
if (args.length > 1)
writeln("your args: ", args);
auto str = readln().strip;
writefln("you type '%s'", str);
}
вызывающая программа
import std.stdio;
import std.process;
import std.array;
void main()
{
writeln("caller start");
auto pipe = pipeProcess(["./gen", "shell", "args"], Redirect.stdin | Redirect.stdout);
scope (exit)
wait(pipe.pid);
//foreach (ln; pipe.stdout.byLine)
// writeln("gen says: ", ln);
pipe.stdin.writeln("my call string");
pipe.stdin.flush();
pipe.stdin.close();
foreach (ln; pipe.stdout.byLine)
writeln("gen says: ", ln);
writeln("caller end");
}

Dmitry
23.08.2016
08:15:20
Что значит stderr.writeln("direct to stderr"); ?

Oleg
23.08.2016
08:15:32
ну то и значит, что оно выводит)))
пишем в файл ошибок)
есть 3 файла
stdin (вход), stdout (выход), stderr (выход ошибок)

Dmitry
23.08.2016
08:16:19
а имена им где задаются?

Oleg
23.08.2016
08:16:35
обычно перенаправляют stdout, а чтобы видеть ошибки, оставляют stderr выходом в консоль
это типа стандарт...

Dmitry
23.08.2016
08:16:50
да? честно не знал...

Google

Oleg
23.08.2016
08:17:09
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8

Dmitry
23.08.2016
08:17:36
тоесть writeln по умолчанию в stdout просто пишет?

Oleg
23.08.2016
08:17:47
да
так вот читать, что вывела программа до конца программы мне как-то не удалось нормально (закомментированные строки)

Dmitry
23.08.2016
08:18:39
а если нужно чтобы оно туда только ошибки писало, то надо stderr.writeln писать? А как оно определяет где ошибка? Получается нужно его так вызывать в блоке catch

Oleg
23.08.2016
08:19:05
stderr это просто диагностические сообщения
понимает только программист где ошибки могут быть, а где нет
можно в stderr лог писать

Dmitry
23.08.2016
08:19:52
так, момент. Проверю у себя на простом примере
Я вот честно нигде в исходниках не видел, чтобы писали так:
stderr.writeln("error");

Admin
ERROR: S client not available

Oleg
23.08.2016
08:25:21
ну хз
а много ты исходников смотрел?)

Dmitry
23.08.2016
08:26:13
а смысл логированния тогда в чем? std.log или как там его?


Oleg
23.08.2016
08:26:28
в том, что это более высокоуровневый метод
а stderr низкоуровневый
grep -r "stderr.writeln" /usr/include/dmd/phobos
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Doing workForce work.");
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Yield from workForce.");
/usr/include/dmd/phobos/std/parallelism.d: debug(std_parallelism) stderr.writeln("totalCPUs = ", totalCPUs);
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln(ii, '\t', elem);
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Done creating nums.");
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Done modulus test.");
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Done squares.");
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Done sums.");
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Creator Raw Index: ", poolInstance.threadIndex);
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("\nCurrent thread is: ",
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Workload distribution: ");
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln(k, '\t', v);
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln(
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Done sum of square roots.");
/usr/include/dmd/phobos/std/parallelism.d: stderr.writeln("Nums: ", nums);
/usr/include/dmd/phobos/std/getopt.d: stderr.writeln("Dunno how verbose you want me to be by saying ",
/usr/include/dmd/phobos/std/datetime.d: stderr.writeln("genTZs.d windowsZones.xml <nix2WinFile> <win2NixFile>");
/usr/include/dmd/phobos/std/process.d: debug std.stdio.stderr.writeln(e.msg);
/usr/include/dmd/phobos/std/net/curl.d: stderr.writeln(e);
/usr/include/dmd/phobos/std/experimental/allocator/common.d: scope(failure) stderr.writeln("testAllocator failed for ", A.stringof);
/usr/include/dmd/phobos/std/numeric.d: scope(failure) stderr.writeln("Failure testing secantMethod");
по бОльшему счёту это осталось только в std.parallelism


Dmitry
23.08.2016
08:27:44
Я праивльно понял, что если мне нужно сделать чтобы:
1. программа что-то писала на экран
2. логировала
я пишу:
`stdout.writeln("print to screen");
stderr.writeln("write to log");`

Oleg
23.08.2016
08:28:24
а ты думаешь, что строка, которую ты на печать отправляешь на что-то влияет?

Google

Oleg
23.08.2016
08:28:32
=)
она просто пишется в stderr
а лог это или не лог, на экран выводится или нет это другой вопрос

Dmitry
23.08.2016
08:29:20
так, а как надо?

Oleg
23.08.2016
08:29:51
я эту строку включил в gen.d только чтобы показать, что можно и мимо stdout написать и это не будет перехвачено другой прогой, которая только stdout перехватывает

Dmitry
23.08.2016
08:32:26
stderr.writeln("direct to stderr");
так эта же штука тоже на экран выведется, но через поток stderr так? Этот поток по умолчанию выводится на экран, но его можно выводить и в файл. Верно?

Oleg
23.08.2016
08:34:14
и stdout и stderr по умолчанию на экран
их можно перенаправить

Dmitry
23.08.2016
08:34:47
а можешь показать как перенаправить?

Oleg
23.08.2016
08:34:48
auto pipe = pipeProcess(["./gen", "shell", "args"], Redirect.stdin | Redirect.stdout);

Dmitry
23.08.2016
08:35:11
а в данном случае куда они перенаправляются?

Oleg
23.08.2016
08:35:17
перенаправлены в pipe.stdin и pipe.stdout
а ты уже можешь ими рулить в вызывающей программе

Dmitry
23.08.2016
08:36:04
а pipe эта структура в которой можно задать имя файла куда оно пишется ?

Oleg
23.08.2016
08:36:33
https://dlang.org/phobos/std_process.html#.ProcessPipes
> можно задать имя файла куда оно пишется ?
нет, мне кажется
если ты попробуешь открыть файл, то он отвяжется от вывода
тебе нужно отдельно создать файл, куда ты хочешь писать
но это мне так кажется

Dmitry
23.08.2016
08:38:34
т.е. auto file = new File("file.txt", w);?

Oleg
23.08.2016
08:38:51
да, а в него уже писать из pipe.stdout
но зачем тебе это?

Dmitry
23.08.2016
08:39:12
да просто разобраться