Недавно мы представили реализацию функции получения среднего времени ответа сервера с помощью команды ping. После публикации статьи нам поступило определенное количество справедливой критики по поводу ненадежности команды ping. По этой причине было решено опубликовать этот рецепт с реализацией того же функционала без использования ping.
Читать далееАвтор: Bagomot
Реализация функции получения среднего времени ответа сервера с помощью команды 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, высокоуровневая структура веб-приложений обеспечивает более быструю и надежную их разработку. Она использует декларативный подход, основанный на классах, для избегания повторов кода. Статическая типизация используется как можно больше для исключения ошибок преобразования, или ошибок доступа к неправильным ключам времени выполнения (например, несуществующее или ошибочное поле формы).
Документация Vibe.d на русском языке. HTTP
Перевод документации к Vibe.d. Часть 2.
Конфигурация сервера
HTTP-сервер поддерживает некоторое количество параметров конфигурации для настройки его поведения. По умолчанию сервер будет прослушивать все локальные сетевые адаптеры на порту 80 и выполнять полный синтаксический анализ запроса. Читать далее