Взаимодействие между процессами – ключевая часть многих современных приложений. Один из способов реализовать это взаимодействие – использование именованных каналов. В Windows именованные каналы представляют собой специализированный механизм IPC (Inter-Process Communication), который могут быть использованы для асинхронного или синхронного обмена данными между сервером и клиентами. В POSIX-совместимых системах аналогичная функциональность достигается через такие механизмы, как FIFO (first-in, first-out) файлы, которые предоставляют однонаправленный канал для передачи данных.
Читать далееАвтор: Bagomot
Использование TCP-соединения для получения среднего времени ответа сервера
Недавно мы представили реализацию функции получения среднего времени ответа сервера с помощью команды ping. После публикации статьи нам поступило определенное количество справедливой критики по поводу ненадежности команды ping. По этой причине было решено опубликовать этот рецепт с реализацией того же функционала без использования ping.
Читать далееРеализация функции получения среднего времени ответа сервера с помощью команды ping
Вам приходилось когда-либо писать клиент-серверные приложения? Если да, то, вероятно, вы сталкивались с необходимостью получения времени ответа сервера. Такая необходимость может быть вызвана, например, при работе клиента с сетью серверов, имеющих разное географическое положение, для выбора оптимального сервера. В этом небольшом рецепте показан пример реализации функции получения среднего времени ответа сервера с помощью системной утилиты ping.
Читать далееДобавление манифеста в приложение Windows
Вы когда-либо пробовали собрать “правильное” приложение dlang для Windows? В этой статье пойдет речь о том, почему я в этом сильно сомневаюсь и причем тут манифест приложения.
Читать далееПользовательские атрибуты (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
Многомерные массивы в D [перевод]
В этой статье я хотел бы сделать краткий обзор того, как создавать, управлять и просматривать многомерные массивы в D.
Читать далееСчастливого Нового года!
Вот и настал тот момент, которого мы все так долго ждали – конец 2020 года, всколыхнувшего практически весь мир чередой не самых приятных событий.
Читать далееПеремещение объектов в heap
Официальная документация частенько удивляет! На этот раз мы нашли полезный рецепт в changelog к старой (на данный момент) версии компилятора.
Шаблон moveToHeap принимает некий объект, извлекает указатель на него, производит выделение памяти с помощью GC.malloc и moveEmplace (который лежит в std.algorithm) осуществляет перемещение данных из одного участка памяти в другой. С помощью взятия и распечатки указателей на объект до и после перемещения убеждаемся, что указывают они на разные участки памяти (указатель – это адрес, распечатав адреса видим что они разные). Читать далее
Idiomatic D. Подводные камни при портировании с C
Очень часто программистам приходится портировать код из одного языка программирования в другой, ведь не писать же свой “велосипед”, когда можно просто “скопипастить” чужой код и немного подправить… Однако, не все так просто! Существуют различные сложности, связанные с архитектурой языков, компиляторов и “железа”. Это, своего рода, “подводные камни”, для преодоления которых, при портировании кода из C в D, может помочь наш очередной перевод статьи Idiomatic D. Читать далее
Документация Vibe.d на русском языке. Веб-фреймворк
Перевод документации к Vibe.d. Часть 3.
Основываясь на низкоуровневой базе HTTP/HTML, высокоуровневая структура веб-приложений обеспечивает более быструю и надежную их разработку. Она использует декларативный подход, основанный на классах, для избегания повторов кода. Статическая типизация используется как можно больше для исключения ошибок преобразования, или ошибок доступа к неправильным ключам времени выполнения (например, несуществующее или ошибочное поле формы).