Pull to refresh
117
0
Вадим Лопатин @Buggins

User

Send message
Не паять — использовать всю плату как дочернюю.
Кстати, чип на DigiKey стоит дороже этой платы — $57.75
Можно ненамного дороже купить китайскую плату на Zynq 7010 — за $47.4
QMTECH Xilinx Zynq7000 Zynq XC7Z010 SoC FPGA Starter Kit Development Board

image

Получаем два ядра ARM Cortex-A9 667MHz, 64MB SDRAM (правда, с 16-bit интерфейсом).
FPGA часть гораздо жирнее — 28K LE
Куча сигналов выведено на два разъема: 40+50 pins
По возможностям похоже на Digilent Cora Z7-10, но в два раза дешевле.
Один минус — не разведена поддержка встроенного ADC, как в Cora. Но с таки количеством свободных ножек можно и внешний ADC повесить.

Похожий принцип используется в аналоговых терменвоксах для управления громкостью (выходное напряжение — управляет VCA).
Но даже там вместо RC генератора используется используется LC для большей чувствительности.
На 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 должна показать лучшие результаты. Проверить пока не получилось.
Попробуй D.
Киллер фича go — goroutines есть и в D — fibers.
Плюс многое другое, чего в Go нет.
Немного быстрее, чем Go.
Для запуска нужны компилятор D (DMD или LDC) и DUB.
Компилировал DMD. LDC должен давать более быстрый код.

Форк.
Прислал 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"
    ]
}
mixin template foo() {
    int y;
}

void fn() {
    mixin foo;
    y = 25;
}

Чем плох D? Что не так с метапрограммированием?
А на свежих андроидах обычное (не предустановленное) приложение может писать на SD карту?
Я подумаю, может быть и выкину лишнее, оставлю Signal

UPD: уже работает мышь и клавиатура
Экспериментирую с добавлением новой платформы — отображение DlangUI виджетов поверх OpenGL сцены, отрисованной другим движком — SFML.

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

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

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

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

GitHub репозиторий с примером
Надо подумать.
Пока еще не поздно поменять.
Если сигнал объявлен как
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;



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

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Date of birth
Registered
Activity