Design (GitHub) je 2D CAD pro GNOME. Instalovat lze i z Flathubu. Běží také ve webovém prohlížeči.
Příspěvek na blogu herního enginu Godot představuje aplikaci Xogot přinášející Godot na iPad a iPhone. Instalovat lze z App Storu. Za Xogotem stojí Miguel de Icaza (GitHub) a společnost Xibbon.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za březen (YouTube).
ESP-IDF (Espressif IoT Development Framework), tj. oficiální vývojový framework pro vývoj aplikací na mikrokontrolérech řady ESP32, byl vydán v nové verzi 6.0. Detaily na portálu pro vývojáře.
DeepMind (Alphabet) představila novou verzi svého multimodálního modelu, Gemma 4. Modely jsou volně k dispozici (Ollama, Hugging Face a další) ve velikostech 5-31 miliard parametrů, s kontextovým oknem 128k až 256k a v dense i MoE variantách. Modely zvládají text, obrázky a u menších verzí i audio. Modely jsou optimalizované pro běh na desktopových GPU i mobilních zařízeních, váhy všech těchto modelů jsou uvolněny pod licencí Apache 2.0. Návod na spuštění je už i na Unsloth.
Cursor (Wikipedie) od společnosti Anysphere byl vydán ve verzi 3. Jedná se o multiplatformní proprietární editor kódů s podporou AI (vibe coding).
Průkopnická firma FingerWorks kolem roku 2000 vyvinula vícedotykové trackpady s gesty a klávesnice jako TouchStream LP. V roce 2005 ji koupil Apple, výrobu těchto produktů ukončil a dotykové technologie využil při vývoji iPhone. Multiplatformní projekt Apple Magic TouchstreamLP nyní implementuje funkcionalitu TouchStream LP na současném Apple Magic Trackpad, resp. jejich dvojici. Diskuze k vydání probíhá na Redditu.
Byla vydána nová verze 10.3 sady aplikací pro SSH komunikaci OpenSSH. Přináší řadu bezpečnostních oprav, vylepšení funkcí a oprav chyb.
Cloudflare představil open source redakční systém EmDash. Jedná se o moderní náhradu WordPressu, která řeší bezpečnost pluginů. Administrátorské rozhraní lze vyzkoušet na EmDash Playground.
Bratislava OpenCamp 2026 zverejnil program a spustil registráciu. Štvrtý ročník komunitnej konferencie o otvorených technológiách prinesie 19 prednášok na rôzne technologické témy. Konferencia sa uskutoční v sobotu 25. apríla 2026 v priestoroch FIIT STU v Bratislave.
A *o na *functor, možná to jen nechápu...
struct { size_t a; size_t b; };
Nejspíš by se i našel způsob, jak během compile-time zjistit, jestli ten member func pointer není větší...
operator (), protože tam se to castuje na jiný typ, než který byl uložený, a každý může mít jinak velké member pointery.
#ifndef NDEBUG ... #endif)
at je hází úmyslně, neházející verze je operator [].
GCC má debug verzi STL, která asserty obsahuje.
typeid(void(Ts...)) nebo neco podobneho.
template <typename ReturnT, typename... ParamTs>
class Callback
{
protected:
struct Iface
{
virtual ~Iface() {}
virtual ReturnT operator ()(ParamTs... params) = 0;
};
template <typename Type>
struct Impl
: public Iface
{
using Func = ReturnT (Type::*)(ParamTs...);
Impl(Type &obj, Func func)
: obj(obj)
, func(func)
{}
virtual ~Impl() {}
virtual ReturnT operator ()(ParamTs... params)
{
return std::forward<ReturnT>(obj.*func(std::forward<ParamTs...>(params)));
}
Type &obj;
Func func;
};
Iface& iface()
{
return *reinterpret_cast<Iface*>(buf);
}
size_t buf[4];
public:
template <typename Type>
Callback(Type &obj,
typename Impl<Type>::Func func)
{
// Místo static_assert lze upravit, aby to použilo new
static_assert(sizeof(Impl<Type>) <= sizeof(buf), "Buffer not large enough to capture callback");
new (buf) Impl<Type>(obj, func);
}
~Callback()
{
iface().~Iface();
}
ReturnT operator ()(ParamTs... params)
{
return std::forward<ReturnT>(iface()(std::forward<ParamTs...>(params)));
}
};
Callback callback(t, &Type::getValueForInput);
int value = callback(input);
std::forward na návratové hodnoty je zbytečný, navíc nebude fungovat s void.
virtual ReturnT operator ()(ParamTs... params) a virtual ~Impl() v Impl by bylo lepší označit override.
Callback templatová třída, pak se rovnou může použít std::function, ne?
operator ()) by šlo zabalit přes reinterpret_cast, protože není polymorfní (takže je to jen pointer na funkci, kde první parametr je this), ale nebude to ověřovat typy parametrů.
Ten reinterpret_cast v původní implementaci nebude fungovat, pokud bude castovat z polymorfní třídy na nepolymorfní či obráceně, a nejspíš ani pokud bude mezi různými stromy polymorfních tříd, protože u virtuálních metod je to typicky implementováno jako index do vtable, nikoliv pointer.
class functor
{
protected:
struct iface { virtual ~iface(){}; };
template <typename... Ts> struct args : public iface
{
virtual void call(Ts...) = 0;
};
template <typename A, typename... Ts> struct impl : public args<Ts...>
{
A* obj;
void (A::*func)(Ts...);
impl(A* o, void (A::*f)(Ts...)) : obj(o), func(f) {}
void call(Ts... args)
{
(obj->*func)(args...);
}
};
size_t i[4];
public:
template<typename A, typename... Ts> functor(A* o, void (A::*f)(Ts...))
{
static_assert(sizeof(impl<A, Ts...>) <= sizeof(i), "Buffer not large enough to capture callback");
new (i) impl<A, Ts...>(o,f);
}
template<typename... Ts> void operator()(Ts... params)
{
args<Ts...> *a = dynamic_cast<args<Ts...>*>(reinterpret_cast<iface*>(i));
if(a) a->call(params...);
else qDebug() << "bad parameters";
}
};
Tiskni
Sdílej: