• Go быстрее Rust, Mail.Ru Group сделала замеры
    0
    На github.com/nuald/simple-web-benchmark появились результаты тестирования D на macbook.
    D получился даже медленней node-js.

    Потестировал D (vibe.d) по сравнению с Go.
    На Windows 7 x64 — vibe.d собранный DMD под x86 чуть быстрее Go только если выбрана конфигурация vibe.d libevent. Иначе в два раза медленней.

    На Linux x86_64 — vibe.d собранный DMD и в default конфигурации и в libevent показывает 45K запросов в секунду, a Go — 50K запросов. Но зато D использует 90% CPU, a Go — 120%.

    Теоретически сборка Vibe.d с помощью компилятора LDC вместо DMD должна показать лучшие результаты. Проверить пока не получилось.
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    0
    Попробуй D.
    Киллер фича go — goroutines есть и в D — fibers.
    Плюс многое другое, чего в Go нет.
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    0
    Немного быстрее, чем Go.
    Для запуска нужны компилятор D (DMD или LDC) и DUB.
    Компилировал DMD. LDC должен давать более быстрый код.

    Форк.
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    +1
    Прислал pull request — код на языке D (vibe-d).

    app.d
    import vibe.d;
    import std.regex;
    
    auto reg = ctRegex!"^/greeting/([a-z]+)$";
    
    shared static this()
    {
        auto settings = new HTTPServerSettings;
        settings.port = 3000;
    
        listenHTTP(settings, &handleRequest);
    }
    
    void handleRequest(HTTPServerRequest req,
                        HTTPServerResponse res)
    {
        if (req.path == "/")
            res.writeBody("Hello, World!", "text/plain");
        else if (auto m = matchFirst(req.path, reg))
            res.writeBody("Hello, " ~ m[1], "text/plain");
    }
    


    dub.json
    {
        "name": "vibedtest",
        "targetName": "vibedtest",
        "targetType": "executable",
        "targetPath": "bin",
        "dependencies": {
            "vibe-d": "~>0.8.1"
        },
        "versions": [
            "VibeDefaultMain"
        ]
    }
    
  • Мысли об идеальном языке программирования
    +2
    mixin template foo() {
        int y;
    }
    
    void fn() {
        mixin foo;
        y = 25;
    }
    
    
  • Мысли об идеальном языке программирования
    0
    Чем плох D? Что не так с метапрограммированием?
  • Получение пути к карте памяти SD Card на Android
    0
    А на свежих андроидах обычное (не предустановленное) приложение может писать на SD карту?
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Я подумаю, может быть и выкину лишнее, оставлю Signal

  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    UPD: уже работает мышь и клавиатура
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Экспериментирую с добавлением новой платформы — отображение DlangUI виджетов поверх OpenGL сцены, отрисованной другим движком — SFML.

    <img src="" alt=«image»/>

    Рожица отрисована SFML, а виджеты — DlangUI.

    Исходники файла, добавленного в dlangui для поддержки новой платформы.

    Для SFML пока сделал только рисование, надо еще добавить трансляцию событий мыши и клавиатуры.

    GitHub репозиторий с примером
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Надо подумать.
    Пока еще не поздно поменять.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    +1
    Если сигнал объявлен как
    Signal!OnClickHandler — то можно вешать несколько обработчиков, с помощью connect и отключать из с помощью disconnect. Присваивание отсоединяет все подключенные слоты и заменяет их одним новым. С помощью ~= новый слот добавляется к имеющимся (аналог connect), -= отключает (то же, что disconnect).
    Если объявлен как
    Listener!OnClickHandler — то возможено подключение только одного слота
    Listener используется вместо Signal там, где хочется сэкономить память ценой урезания функциональности (Listener в два раза меньше занимает памяти, чем Signal).

    import dlangui.core.signals;
    
    interface SomeInterface {
        bool someMethod(string s, int n);
    }
    class Foo : SomeInterface {
    	override bool someMethod(string s, int n) {
    		writeln("someMethod called ", s, ", ", n);
    		return n > 10; // can return value
    	}
    }
    
    // Listener! can hold arbitrary number of connected slots
    
    // declare using list of return value and parameter types
    Listener!(bool, string, n) signal1;
    
    Foo f = new Foo();
    // when signal is defined as type list, you can use delegate
    signal1 = bool delegate(string s, int n) { writeln("inside delegate - ", s, n); return false; }
    // or method reference
    signal1 = &f.someMethod;
    
    // declare using interface with single method
    Listener!SomeInterface signal2;
    // you still can use any delegate
    signal2 = bool delegate(string s, int n) { writeln("inside delegate - ", s, n); return false; }
    // but for class method which overrides interface method, you can use simple syntax
    signal2 = f; // it will automatically take &f.someMethod
    
    
    // call listener(s) either by opcall or explicit emit
    signal1("text", 1);
    signal1.emit("text", 2);
    signal2.emit("text", 3);
    
    // check if any slit is connected
    if (signal1.assigned)
    	writeln("has listeners");
    
    // Signal! can hold arbitrary number of connected slots
    
    // declare using list of return value and parameter types
    Signal!(bool, string, n) signal3;
    
    // add listeners via connect call
    signal3.connect(bool delegate(string, int) { return false; });
    // or via ~= operator
    signal3 ~= bool delegate(string, int) { return false; };
    
    // declare using interface with single method
    Signal!SomeInterface signal4;
    
    // you can connect several slots to signal
    signal4 ~= f;
    signal4 ~= bool delegate(string, int) { return true; }
    
    // calling of listeners of Signal! is similar to Listener!
    // using opCall
    bool res = signal4("blah", 5);
    // call listeners using emit
    bool res = signal4.emit("blah", 5);
    
    // you can disconnect individual slots
    // using disconnect()
    signal4.disconnect(f);
    // or -= operator
    signal4 -= f;
    
    


  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    чтобы необязательна DLL от SDL2 была.
    и можно было более легковесное приложение сделать, вообще без внешних зависимостей.
    около 900К
    а так, под win32 dlangui тоже можно собрать с поддержкой SDL — работает нормально
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    win32 backend — это велосипед на базе win32 api
    sld2 backend — адаптер между sdl2 и dlangui
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Стили есть в теме.
    Можно назначить Id стиля виджету. По умолчанию у стандартных виджетов уже выставлен id родного стиля.
    Можно переопределить часть свойств стиля у конкретного виджета — остальные будут браться из стиля темы.
    Если не переопределять никаких свойств стиля у виджета — будет напрямую использоваться стиль из темы.
    При изменении таких свойств создается новый экземпляр стиля (copy-on-write) с указанием базового стиля — из темы.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Есть слой абстракции от платформы.
    Для конкретной платформы надо определить backend — наследников классов Platform и Window.
    Для win32 это занимает 72Kb, для sdl — 54K.
    Если есть возможность (и dlangui построен с USE_OPENGL), отрисовка идет через OpenGL.
    Иначе платформа должна определить способ отрисовки ARGB битмапа в окно.
    Отрисовка графики идет с использованием интерфейса DrawBuf — в котором реализованы примитивы рисования прямоугольника, битмапа, символа текста, и т.д.
    Также backend должен обеспечить трансляцию событий от мыши и клавиатуры в события dlangui.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    +1
    Скоро будет возможность загрузки layout из xml (как в Android) или чего-то похожего на QML. Выбираю формат. (Issue #58 в трекере)

    Планируется автоматическая привязка загруженных виджетов к полям класса при совпадении ID виджета и названия переменной (например, в ресурсе есть Button с id=«button1», а в классе — переменная Button _button1 — после загрузки ссылка на созданный виджет будет сохранена в эту переменную), а так же автоматическое назначение обработчиков сигналов — по id виджета и названию (например, если есть виджет с id=«button1» а в классе — метод bool onButton1Click(Widget src) — этот метод будет назначен на onClickListener загруженного виджета.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    +1
    Подумаю, что интересного можно рассказать.

    А если коротко, используется двухфазная модель measure / layout как в Android.
    Перерисовка всегда идет полностью.
    При включенном OpenGL все равно только полностью можно перерисовывать.

    Есть разделение на основную часть и backend — код для поддержки конкретной платформы (создание окон, отрисовка bitmap или создание OpenGL контекста, трансляция событий мыши и клавиатуры, ...).

    Графика может рисоваться в bitmap буфер c помощью software renderer, или в OpenGL контекст. Общий интерфейс прячет реализацию.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    LDC я попробовал — он тормозной. Один файл компилирует столько же времени, сколько DMD — проект из сотни файлов.
    Для разработки не очень подходит из-за тормознутости.
    Скорее для финального билда.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    +1
    Пока еще не догнал.
    CTFE и метапрограммирование в D все еще на порядок лучше.
    Чистый синтаксис.
    Многое без garbage collector реализовать сложно или невозможно.
    mixins — навряд ли когда-нибудь будут в C++.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Windows — dmd2.0.66 helloworld (подсчет средней длины строки с stdin) занимает 189K
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Это нормально, окно только маленькое. Надо вручную растянуть.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Для Qt 4 есть пара биндингов.

    Не знаю, насколько эти проекты живые.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Можно сделать темы под каждую систему похожие на нативные.
    Еще проблемы — меню на маке и Unity. Должно быть в системном меню, вместо этого — в верхней части окна. Смотрится чужеродно.

  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Под windows 32bit — 1.4Mb, linux 64bit — 4Mb
    Почему под Linux больше — непонятно.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Примера/туториала нет, но можно сделать.
    Есть какой-нибудь DSFML проект, на котором можно поэкспериментировать?
    Надо реализовать Platform и Window под DSFML.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Добавил скриншот для Ubuntu.
    На Маке проверить не могу — нет его у меня.
  • DlangUI — кросплатформенный GUI для D (Часть 1)
    0
    Могу добавить. Выглядит точно так же, только рамка окна другая и шрифты.
  • Lua API for D language
    0
    Пакетный менеджер и билдер — два в одном.
  • Lua API for D language
    +1
    DUB — очень полезная штука.
    Практически стандарт.
  • Фишки языка D
    0
    Копируется указатель на первый элемент и количество элементов. Элементы массива не копируются.
    Запишутся ли указатель с длиной сразу в rvalue или лишний раз скопируется — не уверен.
  • Фишки языка D
    +2
    Оффтоп, но надеюсь, что кому-нибудь будет интересно.
    Я разрабатываю GUI библиотеку на D — DlangUI
    • Кроссплатформенная, с поддержкой ускорения отрисовки с помощью OpenGL.
    • API напоминает Android UI.
    • Не враппер — написано на D, поэтому легко расширять, добавлять новые виджеты.
    • Внешний вид можно значительно изменять с помощью тем (похожи на темы Android).
    • Unicode и поддержка нескольких языков интерфейса.
    • Адаптация интерфейса под разные размеры и разрешения экрана.

    Демо, нужны GIT, DUB и DMD:
        # Скачать исходники с GitHub
        git clone https://github.com/buggins/dlangui.git
        cd dlangui
        # example 1 - демо, в котором используется большинство виджетов
        dub run dlangui:example1 --build=release
        # tetris - демо, игра TETRIS
        dub run dlangui:tetris --build=release
    

  • Фишки языка D
    0
    А если так?

    auto power2 = delegate(int X) { return X * X; };
    
  • Свободная литература или сказ про дружбу CoolReader c Tor
    0
    Последняя версия CoolReader на маркете уже поддерживает tor proxy для .onion из коробки.
  • Свободная литература или сказ про дружбу CoolReader c Tor
    +1
    Можно в Calibre запустить сервер OPDS. Подключаться кулридером по https с login/password.
    Получится доступ к коллекции.
  • Свободная литература или сказ про дружбу CoolReader c Tor
    +1
    Добавил поддержку TOR Proxy — ORobot для доступа к OPDS

    CoolReader-3.1.2-45.apk

    В качестве OPDS URL просто укажите .onion сайт. Например, flibustahezeous3.onion/opds (ORobot должен быть запущен).

    Другие изменения:
    Доступен выбор бОльших размеров шрифта (в зависимости от размера экрана).
    Исправлен размер тулбаров.
    Имя пользователя и пароль, а также поддержка HTTPS для OPDS.
    Исправлена поддержка MOBI.
  • Свободная литература или сказ про дружбу CoolReader c Tor
    +1
    Попробуй Calibre
  • Свободная литература или сказ про дружбу CoolReader c Tor
    0
    HTTP proxy не российский помог бы? Или только tor/i2p поможет?
  • Свободная литература или сказ про дружбу CoolReader c Tor
    0
    Вроде бы работает флибуста.
  • Samsung объявляет конкурс Russia Tizen App Challenge для веб-разработчиков из России
    0
    Жаль, нативные приложения не принимаются :(