В некоторых ситуациях возникает необходимость предотвратить запуск более одного экземпляра приложения. Это может быть полезно для защиты от нежелательного поведения, конкуренции за ресурсы, нарушения логики работы и других подобных проблем. Для решения этой задачи можно использовать системные API Windows или POSIX.
Читать далееАвтор: Bagomot
Взаимодействие между процессами: именованные каналы
Взаимодействие между процессами – ключевая часть многих современных приложений. Один из способов реализовать это взаимодействие – использование именованных каналов. В Windows именованные каналы представляют собой специализированный механизм IPC (Inter-Process Communication), который могут быть использованы для асинхронного или синхронного обмена данными между сервером и клиентами. В POSIX-совместимых системах аналогичная функциональность достигается через такие механизмы, как FIFO (first-in, first-out) файлы, которые предоставляют однонаправленный канал для передачи данных.
Читать далееИспользование 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. Читать далее