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]

Filtri di FlatPress portati in Python

Da un bel po’ di tempo sto pensando di passare ad un sistema in Python per gestire il mio sito.

C’è solo una cosa che mi ferma: quando scrivo un articolo, la maggior parte è scritta in HTML puro, però ci sono anche alcuni tag speciali che usano dei plugin FlatPress ed in generale prima di mandare in output un post ci sono diversi filtri, ereditati da WordPress, che ne modificano il contenuto, abbellendone la tipografia (per esempio cambiando gli apici e le virgolette normali), bilanciando i tag se mi ero dimenticato di farlo etc.

Sono tanti anni che scrivo questo articoli su questo sito e ormai ne ho già accumulato un discreto numero, quindi passarli uno ad uno è un’opzione improponibile. Rimangono le due possibilità di prerenderizzare tutto e portare nel nuovo sistema un codice in puro HTML, oppure portare al nuovo sistema i vecchi filtri. Io ho scelto quest’ultima.

Alla fine FlatPress non ne usa così tanti: di default solo wpautop, wptexturize e conver_chars, che rispettivamente sistemano gli a capo, i break e i paragrafi, sistemano la tipografia e convertono alcune entities. Poi però ci sono anche alcuni plugin, in particolare il BBCode che aiuta davvero molto con l’inserimento delle immagini e la gesione di lightbox. … [Leggi il resto]

vCard Cleaner

Una funzionalità che trovo molto comoda della rubrica Android è la possibilità di poter esportare la rubrica in VCF.

Non so se più per romanticismo o più per fondata paranoia, non voglio salvarla su un servizio cloud come Gmail, però non voglio neanche rischiare di perderla, quindi questi file sono la scelta migliore.

Sul mio vecchio Huawei Y530 andavo abbastanza bene, perché riuscivo a esportare insieme tutti i contatti da un unico provider di rubrica, in particolare dall’archiviazione locale del telefono, possibilità che non ho più trovato nella Cyanogenmod che uso sul mio Oneplus One.

Infatti adesso posso sì decidere che contatti esportare, ma vedo tutti i contatti insieme, compresi i duplicati creati da Telegram e Whatsapp e i contatti di cui ho solo l’indirizzo e-mail su Gmail.

Ho così deciso di fare uno script in Python che ripulisce il file esportato, cancellando i contatti privi di numero telefonico e mette insieme i duplicati. Inoltre se uno stesso numero è ripetuto più di una volta per il contatto, viene tenuto solo una volta.

Lo script potrebbe essere un po’ migliorato, facendo in modo che, per esempio, accetti da argomenti i file da pulire, anziché scriverli nel file stesso.

Come dipendenza ha solo VObject che può essere installata tramite pip oppure tramite altri gestori di pacchetti (è presente, per esempio, nei repository Debian, sotto nome di python-vobject).

Il mio script è rilasciato nel pubblico dominio, invece VObject (almeno al momento di scrittura dell’articolo) è rilasciato sotto licenza Apache 2.0.

Download: vcard_cleaner.py.

Python SSH Tunnel Server

SSH tunnels are great!

They allow to bypass firewalls and NAT problems, and you can use as unprivileged user, since you don’t have to install virtual network devices such as TUN or TAP.

Another good reason to chose SSH is that it is a standard protocol, so there are many implementations: OpenSSH on most Unices, PuTTY on Windows and cross platform libraries (Java, Python…).

However there is a great disadvantage: the SSH server. If you have a server you probably already use SSH, therefore you don’t want to share your custom port and grant access to your server, or create accounts to allow it.

A solution could be creating a chroot or something like that, but I wasn’t really confident in it, therefore I looked for an alternative SSH server, and I’ve come up with this library: TunnelServer.

Python already has a brilliant SSH library: Paramiko. It’s very transparent: it manages the packages for you, but you are the one who should manage the rest (login check, shell comunication, PTY allocation…, socket-ssh channel synchronization). That’s great, but sometimes unhandy, so I’ve written this class, which is a middleware: the class user still has to check login, but you don’t have to create threads to listen on forwards etc… … [Leggi il resto]

Download video in streaming flash con Python

Un tempo su Linux si poteva trovare un video guardato in streaming direttamente nella directory /tmp.

In seguito, con degli aggiornamenti, flash scaricava il video sempre lì, ma veniva eliminato, anche se fisicamente presente.

Per ritrovarlo bastava trovare il processo dell’implementazione flash del browser, solitamente con ps aux | grep flash e così si trovavano i possibili pid.

Andando a vedere nella directory /proc/pid/fd, si trovavano tanti link, uno di questi a un file tipo /tmp/Flash.... In seguito si poteva trattare quel link come se fosse un file normale, quindi riprodurlo, passarlo a mencoder o ffmpeg etc… Se volevate copiarlo dovevate aspettare che il browser avesse finito di scaricare il video!

In seguito sembrava essere scomparsa anche questa possibilità, ma oggi mi sono accorto che è tornata, quindi vi lascio un breve file in python che permette di trovare automaticamente i vari file:

#!/usr/bin/env python
import os

for pid in os.listdir('/proc'):
	if not pid.isdigit():
		continue

	fdpath = '/proc/' + str(pid) + '/fd'
	try:
		fd = os.listdir(fdpath)
	except:
		continue

	for fid in fd:
		try:
			# Not a link? Raise exception
			fname = os.readlink(fdpath + '/' + fid)
			fname = fname.strip()

			if fname.lower().find('/tmp/flash') == 0:
				fname = fname.split(' ')<sup><a id="entry140508-164044-rel-0" href="#entry140508-164044-fn-0" title="Note 0">0</a></sup>
				print fdpath + '/' + fid + ' => ' + fname

		except:
			continue

Questo script è stato scritto molto velocemente: cerca di andare in tutti i pid e di trovare i vari link. Se contengono la parola flash stampa il link e la destinazione. So che si potrebbe fare una cosa migliore ma in questo caso preferisco fare lo script kid 😊 .

Lo rilascio nel pubblico dominio.

Comunque se volete scaricare video da siti come youtube ed altri, vi consiglio di non adottare questo metodo ma di usare direttamente youtube-dl, che è fantastico!