Python custom exceptions in C(++) extensions

Python is a nice scripting language, but it has the fame of being difficult to embed and interact with existing projects.

Until now, I have been able to embed it in the software I work on with pybind11 and Binder (half of my MS degree thesis is about that), I had some problems, but I was able to solve most of them. But recently I have experienced a problem that is quite uncommon on the Internet: declaring a new exception in a native (C++/C module) with some custom methods/properties.

The existing proposal

I quickly looked on the Internet for the problem. The Python C API makes creating an exception type possible with PyObject *PyErr_NewException(const char *name, PyObject *bases, PyObject *dict): the first parameter is the name of the exception, in the modulename.ExceptionName format, the second parameter is the base or bases of the new exception (can be a PyType, or a tuple of PyTypes), and a dictionary of custom members and methods for the new type.

However both the second and third parameter can be left to NULL: in this case the new type will inherit from PyExc_Exception and will not have customizations. This is the majority of the cases, and by a search on the CPython code I could not find any reference that could use as an example on how to use the dict parameter. … [Leggi il resto]

Alcuni appunti su Bullet e raylib

In passato mi è già capitato di parlare di Bullet, lo avevo usato qualche volta tanto tempo fa, tanto che ne avevo fatto anche due-tre articoli nel 2012!

Da allora molte cose sono cambiate, tranne le API di Bullet, che almeno superficialmente sono più o meno sempre quelle, e l’interesse che sporadicamente rinasce in me per quella libreria.

Una cosa che è cambiata è che ho cominciato a lavorare su un software di modellazione 3D, e in particolare mi occupo della parte dei plugin, di fare esempi a scopo di documentazione e cose del genere. Così avevo avuto l’idea di provare a scriverne uno di integrazione con Bullet.

L’idea alla fine non è partita, ma a me era rimasta la voglia di sperimentare un po’ con questo motore, e in particolare anche vedere come si comporta con la parte di softbody.

Così nelle ultime due settimane ho un po’ lavorato a questi esempi e avevo l’idea di farne anche alcuni carini, ma mi sa che metterò un po’ in pausa l’idea, quindi intanto volevo condividere qui alcune delle cose che ho imparato. … [Leggi il resto]

WiFi lento su Oneplus One

Negli ultimi tempi avevo accumulato un po’ di app che non mi sarebbero più servite, quali applicazioni per i treni di 3 paesi diversi, app per alberghi e aerei, quindi, sfruttando anche il periodo di calma con le ferie, ho deciso di fare pulizia a modo mio: cambiando ROM e aggiornando il mio vetusto Oneplus One ad Android 10/Q.

La cosa non è stata proprio indolore: la prima ROM che ho provato aveva problemi con le gestures di Q, la batteria durava pochissimo, dovevo caricarlo anche due volte al giorno, e il solito problema del WiFi limitato a pochi megabit/s.

Quello della batteria si è rivelato essere un problema collegato alle Gapps: il Google Play Services era la principale causa del consumo di batteria e, fortunatamente, cambiando di nuovo ROM (con MSM Xtended) l’ho risolto. Ma prima di risolverlo, ero quasi arrivato al punto di cambiare telefono, la mia unica speranza era quella di vedere come sarebbero stati i consumi una volta tornato al lavoro.

Quello del WiFi invece mi dava proprio fastidio, anche perché appena installata la ROM non si era verificato e mi ero intestardito a tal punto che ero disposto ad accettare solo un grosso bug: o il WiFi, o la batteria. … [Leggi il resto]

Disconnessioni con Atheros AR9485

Da alcuni mesi ho un bug decisamente antipatico con il WiFi nel mio portatile ASUS N550, dotato di una Qualcomm Atheros AR9485.

La scheda ha sempre funzionato abbastanza bene, viene gestita dal leggendario driver ath9k, uno dei migliori driver prima dell’arrivo di 802.11AC, anche se comunque il mio modello di scheda non è mai stato considerato uno dei migliori.

Ad un certo punto, però, ho cominciato a riscontrare continue disconnessioni, o in alcuni test con wget e altri computer della LAN, riscontravo un brusco calo della velocità di download fino al fermarsi dello stesso.

In particolare, su dmesg riscontravo questo errore:

[   65.582958] ath: phy0: DMA failed to stop in 10 ms AR_CR=0x00000024 AR_DIAG_SW=0x02000020 DMADBG_7=0x00006100
[   66.744578] wlp4s0: authenticate with e8:de:27:xx:xx:xx
[   66.764530] wlp4s0: send auth to e8:de:27:xx:xx:xx (try 1/3)
[   66.769890] wlp4s0: authenticated
[   66.771192] wlp4s0: associate with e8:de:27:xx:xx:xx (try 1/3)
[   66.775556] wlp4s0: RX AssocResp from e8:de:27:xx:xx:xx (capab=0x431 status=0 aid=6)
[   66.775668] wlp4s0: associated

Come potete vedere, è capitato a solo un minuto dal boot. … [Leggi il resto]

Bisca: il backend

È passato un po’ di tempo da quando avevo detto di aver cominciato a lavorare sul progetto della Bisca online. Da allora mi sono laureato, sono andato a trovare dei miei amici in giro per l’Europa, ma ce l’ho anche fatta ad andare avanti col progetto, tanto che ce n’è anche una versione online qui, sul mio VPS.

Il frontend è stato fatto senza usare alcun framework, l’unica dipendenza da terzi è socket.io, che uso per gestire i vari eventi su websocket, per il resto ho implementato tutto io. Comunque non è troppo curato e, di sicuro, se vorrò continuare con questo progetto, dovrò sistemarlo. Anzi, il Javascript che gestisce il gioco potrebbe essere un esempio di come non scrivere codice in questo linguaggio 😅️ .

Ma ciò di cui voglio parlare in questo articolo non è tanto il frontend, quanto il backend.

Come avevo già accennato, avevo valutato di usare il server ufficiale di socket.io, scritto in Javascript per Node.js, ma alla fine ho deciso di usare il port in Python.

Bisca come gioco non è difficile, tuttavia ci sono alcune cose a cui bisogna prestare attenzione.

La prima è l’asso di denari, che può essere sia la carta più bassa, che la più alta del gioco. … [Leggi il resto]