Взаимодействие между процессами: именованные каналы

Взаимодействие между процессами – ключевая часть многих современных приложений. Один из способов реализовать это взаимодействие – использование именованных каналов. В Windows именованные каналы представляют собой специализированный механизм IPC (Inter-Process Communication), который могут быть использованы для асинхронного или синхронного обмена данными между сервером и клиентами. В POSIX-совместимых системах аналогичная функциональность достигается через такие механизмы, как FIFO (first-in, first-out) файлы, которые предоставляют однонаправленный канал для передачи данных.

Читать далее

Использование TCP-соединения для получения среднего времени ответа сервера

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

Читать далее

Реализация функции получения среднего времени ответа сервера с помощью команды ping

Вам приходилось когда-либо писать клиент-серверные приложения? Если да, то, вероятно, вы сталкивались с необходимостью получения времени ответа сервера. Такая необходимость может быть вызвана, например, при работе клиента с сетью серверов, имеющих разное географическое положение, для выбора оптимального сервера. В этом небольшом рецепте показан пример реализации функции получения среднего времени ответа сервера с помощью системной утилиты ping.

Читать далее

Пользовательские атрибуты (UDA) [перевод]

Пользовательские атрибуты (User-Defined Attributes, UDA) – это выражения времени компиляции, которые можно добавить к объявлению чего-либо. Затем эти атрибуты можно запрашивать, извлекать и изменять во время компиляции. Для них нет исполняемого компонента.

Пользовательский атрибут выглядит, например, так:

@(3) int a;

@("string", 7) int b;

enum Foo;
@Foo int c;

struct Bar
{
    int x;
}

@Bar(3) int d;

Если в области действия объявления есть несколько UDA, они объединяются:

@(1)
{
    @(2) int a;         // имеет UDA (1, 2)
    @("string") int b;  // имеет UDA (1, "string")
}

Пользовательские атрибуты могут быть извлечены в кортеж выражения с помощью __traits:

@('c') string s;
pragma(msg, __traits(getAttributes, s)); // выведет tuple('c')

Если для символа нет определенных пользователем атрибутов, возвращается пустой кортеж. Кортеж выражения можно превратить в управляемый кортеж:

enum EEE = 7;
@("hello") struct SSS { }
@(3) { @(4) @EEE @SSS int foo; }

alias TP = __traits(getAttributes, foo);

pragma(msg, TP); // выведет tuple(3, 4, 7, (SSS))
pragma(msg, TP[2]); // выведет 7

Конечно, для объявления можно использовать типы кортежей:

TP[3] a; // a объявлен как SSS

Атрибут имени типа не совпадает с атрибутом переменной:

pragma(msg, __traits(getAttributes, typeof(a))); // выведет tuple("hello")

Настоящая ценность UDA – это возможность создавать определяемые пользователем типы с конкретными значениями. Значения атрибутов базовых типов не масштабируются. Кортежами атрибутов можно управлять, как и любым другим кортежем, и их можно передать в качестве списка аргументов в шаблон.

Являются ли атрибуты значениями или типами, зависит от пользователя, и будут ли более поздние атрибуты накапливаться или переопределяться более ранними, также зависит от того, как пользователь их интерпретирует.

UDA нельзя привязать к параметрам шаблона.

Источник: User-Defined Attributes

Перемещение объектов в heap

Официальная документация частенько удивляет! На этот раз мы нашли полезный рецепт в changelog к старой (на данный момент) версии компилятора.

Шаблон moveToHeap принимает некий объект, извлекает указатель на него, производит выделение памяти с помощью GC.malloc и  moveEmplace (который лежит в std.algorithm) осуществляет перемещение данных из одного участка памяти в другой. С помощью взятия и распечатки указателей на объект до и после перемещения убеждаемся, что указывают они на разные участки памяти (указатель – это адрес, распечатав адреса видим что они разные). Читать далее

Idiomatic D. Подводные камни при портировании с C

Очень часто программистам приходится портировать код из одного языка программирования в другой, ведь не писать же свой “велосипед”, когда можно просто “скопипастить” чужой код и немного подправить… Однако, не все так просто! Существуют различные сложности, связанные с архитектурой языков, компиляторов и “железа”. Это, своего рода, “подводные камни”, для преодоления которых, при портировании кода из C в D, может помочь наш очередной перевод статьи Idiomatic D. Читать далее

Документация Vibe.d на русском языке. Веб-фреймворк

Перевод документации к Vibe.d. Часть 3.

Основываясь на низкоуровневой базе HTTP/HTML, высокоуровневая структура веб-приложений обеспечивает более быструю и надежную их разработку. Она использует декларативный подход, основанный на классах, для избегания повторов кода. Статическая типизация используется как можно больше для исключения ошибок преобразования, или ошибок доступа к неправильным ключам времени выполнения (например, несуществующее или ошибочное поле формы).

Читать далее