pico-usb-wifi je open source firmware pro Raspberry Pi Pico W, který jej promění v USB Wi-Fi adaptér. Po připojení k počítači se objeví jako zařízení USB CDC-NCM.
Americká společnost Google ze skupiny Alphabet bude muset podle nových požadavků Evropské unie umožnit společnosti OpenAI i dalším konkurentům v oblasti umělé inteligence (AI) a internetových vyhledávačů přístup ke svým službám. Ve svém rozhodnutí o tom včera informovala Evropská komise (EK). Opatření má zajistit dodržování pravidel, jejichž cílem je omezit v EU tržní sílu velkých technologických firem. Google s tím nesouhlasí.
… více »Nové verze webových prohlížečů Chrome a Firefox jsou vydávány každé 4 týdny. Aktuální verze Chrome je 150. Aktuální verze Firefoxu je 152. V březnu bylo oznámeno, že od září přejde Chrome na dvoutýdenní cyklus vydávání verzí. To by znamenalo, že Chrome v číslování verzí Firefox brzy přeskočí. Vývojáři Firefoxu proto také od září přecházejí na dvoutýdenní cyklus vydávání verzí. :-)
Microsoft Comic Chat (Wikipedie), tj. grafický IRC klient z devadesátek, který převáděl konverzace na IRC do podoby komiksových panelů, a který zpopularizoval font Comic Sans, je dnešním dnem open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
Byla vydána (𝕏) nová verze 26.7 open source firewallové a routovací platformy OPNsense (Wikipedie). Jedná se o fork pfSense postavený na FreeBSD. Kódový název OPNsense 26.7 je Xenial Xenops. Přehled novinek v příspěvku na fóru.
Na Seznam nepovolených internetových her (Wikipedie) se k 13. 7. 2026 dostala predikční platforma Polymarket.
Nová čísla časopisů od nakladatelství Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 167 (pdf) a Hello World 30 (pdf).
Byla vydána nová verze 3.22.0 grafického vývojového prostředí a platformy Gambas (Wikipedie) založené na interpretru programovacího jazyka Basic s rozšířením o objektově orientované programování. Přehled novinek v poznámkách k vydání. Zdrojové kódy jsou k dispozici na GitLabu.
FreeBSD odstranilo poslední GPL kód ze základního systému. Konkrétně dpv, libdpv, libfigpar a dialog. Instalátor před čtyřmi lety přešel z dialogu na bsddialog.
Sociální síti 𝕏 (dříve Twitter) má dnes 20 let. Pro veřejnost byla zpřístupněna 15. července 2006.
// C interface
alias extern(C) void function(void*) CallbackFunc;
extern(C) extern void nejaka_c_fce(CallbackFunc func, void* data);
extern(C) extern void cekej_na_callback();
//
class Bla
{
uint[] nejakyData;
this()
{
nejakyData = new uint[1024*1024*10]; // 40M
nejaka_c_fce(&cCallback, cast(void*)this);
}
void callback()
{
// něco tady
}
static extern(C) cCallback(void *data)
{
Bla self = cast(Bla)data;
self.callback();
}
}
// ...
Bla bla;
void main()
{
while (true)
{
bla = new Bla();
cekej_na_callback();
// tahle fce čeká na nějaký data a až dorazí
// tak zavolá ten callback v tomhle samým vlákně,
// pak vrátí
}
}
Něco v tom stylu výše. Referenci na objekt samozřejmě držím stranou, dokud není zavolán callback, takže problém se zrušením objektu by neměl nastat (a ani nenastane, o čemž jsem se přesvědčil přidáním destruktoru).
const(void*)this, tak kód funguje.
import std.stdio;
import core.thread;
//import wayland.callback;
class Callback
{
void delegate(uint) m_callback;
Callback m_next;
uint[] m_lotsOfData;
public this(void delegate(uint) cb)
{
writefln("Callback %s create", cast(void*)this);
m_lotsOfData = new uint[1024*1024*10]; // 40M
writefln("Callback %s alloc done", cast(void*)this);
m_callback = cb;
}
~this()
{
writefln("Callback %s destroy", cast(void*)this);
}
public void call(uint bla)
{
m_callback(bla);
}
}
class Bla
{
Callback m_callbacks;
Callback m_last;
public Callback createCallback(void delegate(uint) cb)
{
Callback ret = new Callback(cb);
if (m_last is null)
m_callbacks = ret;
else
m_last.m_next = ret;
m_last = ret;
return ret;
}
public Callback createCallback(void function(uint) cb)
{
return createCallback( (uint bla) { cb(bla); } );
}
public void run()
{
while (m_callbacks !is null)
{
Callback cb = m_callbacks;
m_callbacks = cb.m_next;
cb.m_next = null;
if (m_callbacks is null)
m_last = null;
cb.call(111);
}
}
}
Bla bla;
void proc(uint serial)
{
writeln("call");
Thread.sleep(dur!("msecs")(10));
bla.createCallback(&proc);
}
void main()
{
bla = new Bla();
bla.createCallback(&proc);
bla.run();
}
/*
Display display;
SyncCallback cb;
void proc(uint serial)
{
writeln("sync");
Thread.sleep(dur!("msecs")(10));
cb = display.sync(&proc);
}
void main()
{
display = new Display(null);
cb = display.sync(&proc);
while (true)
display.dispatch();
}
*/
Řešení dotazu:
Jseš si jistý, že třída v D bude binárně kompatibilní se třídou v C++? Já si myslím, že to zaručeno není:
http//www.digitalmars.com/d/1.0/class.html
The D compiler is free to rearrange the order of fields in a class to optimally pack them in an implementation-defined manner.
Možná to nefunguje z tohoto důvodu:
http://www.digitalmars.com/d/1.0/garbage.html
void* p; ... int x = cast(int)p; // error: undefined behavior
garbage collector v D takové přetypování nedovoluje udělat
Přečti si všechno, co se píše v tom odkazu. Je úplně jedno, jestli přetypováváš na int nebo na instanci nějaké třídy. Navíc garbage collector v D se může kdykoliv rozhodnout přesunout ten objekt v paměti jinam, takže jakýkoliv void pointer ztrácí platnost (což bude ten důvod, proč to padá):
A copying garbage collector can arbitrarily move objects around in memory
Možný workaround by byl získat pointer na referenci místo objektu, ale musel bys zajistit, že ta reference nezanikne a taky to není hezké řešení.
A copying garbage collector can arbitrarily move objects around in memoryTo zní docela zajímavě. Možná by Jardíkovi pomohl odkaz na nějaké howto jak předávat callbacky s odkazem na třídu, protože to při kombinování D a C musí být každodenní use case. Není něco takového? Přecijem je D novější jazyk než C a tudíž se dá počítat, že chce fungovat i ve stávajícím ekosystému.
// Typical C-style callback mechanism; the passed function
// is invoked with the user-supplied context pointer at a
// later point.
extern(C) void addCallback(void function(void*), void*);
// Allocate an object on the GC heap (this would usually be
)// some application-specific context data.
auto context = new Object;
// Make sure that it is not collected even if it is no
// longer referenced from D code (stack, GC heap, …).
GC.addRoot(cast(void*)context);
// Also ensure that a moving collector does not relocate
// the object.
GC.setAttr(cast(void*)context, GC.BlkAttr.NO_MOVE);
// Now context can be safely passed to the C library.
addCallback(&myHandler, cast(void*)context);
extern(C) void myHandler(void* ctx)
{
// Assuming that the callback is invoked only once, the
// added root can be removed again now to allow the GC
// to collect it later.
GC.removeRoot(ctx);
GC.clrAttr(ctx, GC.BlkAttr.NO_MOVE);
auto context = cast(Object)ctx;
// Use context here…
}
Tiskni
Sdílej: