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]

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]

Bisca

Ho realizzato che è da un pezzo che non lavoro seriamente su un progetto mio.

Negli ultimi mesi, ho realizzato il plugin su cui ho scritto la mia tesi di laurea, però non conta troppo, perché, anche se qualche volta ho approfondio e fatto test durante il weekend, ci lavoravo principalmente durante la giornata lavorativa. E proprio per questo, tecnicamente non è neanche mio, perché la proprietà intellettuale del progetto è dell’azienda dove l’ho realizzato.

Adesso comunque per la tesi dovrei essere in dirittura d’arrivo e, appunto, ho deciso di cominciare un progetto che potessi dire completamente mio.

Già tempo addietro un mio amico mi aveva insegnato un gioco che noi chiamiamo “bisca”, ma non ho trovato un altro nome con cui sia conosciuto in giro per l’Internet.

Il gioco è carino e coinvolgente, quindi ho deciso di farne una versione online, anche perché col tempo ci siamo tutti un po’ sparsi, così è un modo anche per ritrovarsi virtualmente.

Come ho già detto in altre occasioni, trovo abbastanza noioso lo sviluppo di cose per il web, siano siti, oppure app, o altro ancora, tuttavia devo dire che mi sembra il modo migliore per sviluppare questo progetto. … [Leggi il resto]

Kinect, Kinect One, OpenCV e OpenNI, come siamo messi?

Di recente ho giocato un pochino con i dispositivi del titolo: Kinect per Xbox 360 e Kinect per Xbox One. Ma non ci ho giocato né con l’Xbox, né per scopo (puramente) ludico: potrebbero diventare l’argomento della mia tesi di laurea.

Ma torniamo indietro un secondo, anzi di qualche mese. A metà febbraio ho cominciato il mio tirocinio obbligatorio per la laurea, e ho deciso di farlo presso un’azienda che sviluppa un software di modellazione 3D per Windows e Mac. Più precisamente, io mi sto concentrando sulla possibilità di creare plugin per questo software in Python, in aggiunta alla possibilità di farlo in C++, già esistente.

La cosa più diffusa per il mio corso di laurea è quella di fare il tirocinio lungo e poi la tesi che lo riguardi. Siccome il mio relatore si occupa di Computer Vision (il corso più bello che io abbia fatto
in 5 anni di università, davvero) abbiamo pensato di fare un qualche plugin che riguardi la computer vision per il software, almeno per scopo didattico.

Abbiamo avuto diverse idee, e alcune di queste riguardano l’uso di sensori che possano rilevare la profondità, tra questi ci sono le due Kinect, che sono abbastanza diffuse. In ufficio avevamo già una Kinect per Xbox 360, poi il mio amico Giacomo mi ha prestato una Kinect per Xbox One. … [Leggi il resto]

Whoosh come motore di ricerca per un blog

Da un bel po’ di tempo il mio sito sta aspettando un bell’aggiornamento, ma ogni volta mi blocco per un motivo o per l’altro. Questa volta è stato il turno della ricerca.

Questa funzionalità è una delle più complicate da implementare, per una moltitudine di fattori, che vanno dalla necessaria attenzione alle prestazioni al fatto che la ricerca non è un problema con una soluzione precisa. Non a caso i motori di ricerca di oggi si basano completamente su algoritmi di machine learning, che però per un piccolo sito come il mio, che vuole comunque offire questa possibilità, sarebbe un’esagerazione, peraltro impossibile, in quanto non avrei nemmeno i dati per il training.

In ogni caso, non voglio rimuovere questa funzionalità dal sito, né implementarla in maniera troppo inefficace, né rivolgermi a servizi di terzi, quindi mi sono guardato un po’ attorno per decidere sul da farsi e ho provato diverse soluzioni.

Come già annunciato, sto lavorando in Python, con Django, quindi il mio primo passo è stato provare Haystack.

Questo è un framework che fa da ponte tra i modelli dell’ORM di Django e diversi backend per la ricerca, tra cui i celebri Elasticsearch e Solr, entrambi basati su Apache Lucene, e i meno famosi Xapian e Whoosh. Precisamente Haystack mette a disposizione delle API agnostiche dal backend per indicizzare, eseguire ricerche ed altre operazioni sui modelli di Django. Quindi, una volta creato il codice basato su Haystack, si possono facilmente provare i vari backend. … [Leggi il resto]