cose da ricordare
Sulla mailing list di solr vengono sempre citati programmi interessanti.
eccone due
jvisualvm e http://haproxy.1wt.eu/
Solr – Filtrare risultati irrilevanti
la ricerca di frasi composte da molte parole pone diversi problemi.
Il minimo numero di parole che devono essere trovate non può essere il 100% perchè non tutte le parole hanno la stessa importanza e la presenza di quelle chiave è sufficiente a trovare documenti attinenti.
però il numero di risultati trovati viene comunque influenzato malamente dalle parole poco significative.
per esempio se cercassi “il cane e la gatta” con un numero minimo di parole =3 (mm=3) avrei come ultimi risultati a bassa rilevanza conententi solo “il” e “e” “la”. Chiaramente si può intervenire eliminando gli articoli italiani dall’indice, ma questo è solo un esempio il problema si riproporrebbe con altre parole diffuse, ad esempio cercando il titolo di un film.
Ieri ho aggiunto un nuovo trucchetto al mio arsenale solr
q={!frange l=0.75}query($qq)&qq={!dismax mm=1 qf=”name description” pf=”name description” qt=myconf}tanto va la gatta al lardo che ci lascia lo zampino
Questo mostriciattolo esegue una query dismax su alcuni campi, richiamando le impostazioni di un query type e modificandolo in modo da trovare tutti i risultati che matchano almeno una parola. Fatto questo i risultati vengono filtrati in modo da avere almeno uno score 0.75
Volendo generalizzare, se analizzando la rilevanza dei risultati prodotti doveste scoprire che sotto un certo valore quello che esce è generalmente irrilevante e non vale la pena listarlo potete intervenire aggiungendo un frange e magia non dovete ritarare tutta la configurazione del qt come il mm, i pesi di qf e pf ecc.
enjoy
@RequestParam intercettare gli errori e modificare la risposta
con spring è comodissimo ricevere i parametri delle richieste utilizzando l’annotazione @RequestParam
per esempio
@RequestMapping(“/getCorrelatiProdotti.do”)
public @ResponseBody Object getRelatedProductsHttpGet (
@RequestParam(value = “skuItem”, required = true) String sku,
@RequestParam(value = “idSito”, defaultValue = “0”) String idSito,
@RequestParam(defaultValue=”true”) boolean jsonp,
ModelMap model)
definisce diversi parametri tra cui uno obbligatorio, e uno booleano. Se il parametro obbligatorio manca o il booleano riceve un testo che booleano non può essere (vale anche per numeri ecc) normalmente viene inviata una risposta in stato http 400.
Avendo la necessità di rispondere un JSON anche in caso di errore ho dovuto modificare questo comportamento. Dopo un sacco di ricerche ho trovato il modo per farlo
@ExceptionHandler(MissingServletRequestParameterException.class)
public @ResponseBody Object handleMyException(Exception exception, HttpServletRequest request,
HttpServletResponse response) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
/** omissis prepara degli oggetti con la descrizione degli errori */
Map<String,Object> ret = new HashMap<String, Object>();
ret.put(“State”, state);
ret.put(“error”, error);
return ret;
}
L’annotazione @ExceptionHandler permette di intercettare l’eccezione, i parametri del metodo possono essere i più disparati, tra cui l’eccezione, la request e la response.
a questo punto non bisogna fare altro che restituire un oggetto con la struttura che si vuole inviare al client.
letture recenti
ho appens finito di leggere note di fisica statistica di Roberto Piazza
e stata un’ottima scelta, gli argomenti sono esposti in modo logico ed anche ad un turista della fisica come me è stato possibile acquisire qualche nozione interessante
lo rileggerò senz’altro perchè leggere un libro con così tante idee una sola volta è un peccato capitale
poi mi toccherà leggere qualche cosa sulle hamiltoniane e sulla meccanica quantistica, che xpessissimo fa capolino nel libro
Prima di rituffarmi in tutta questa fisica però ho comprato
java 7 new features cookbook ,
vedremo come va questa lettura qualchecosa convincente eutile com eloperatore diamante molte altre cose 0troppo di nicchia e poco utili
vedremo
Risposte quiz sequenze di eventi casuali
Ciao,
Il problema di trovare una picola sequenza particolare in più lunghe sequenze di eventi casuali di una certa lunghezza mi è venuto in mente qualche anno fa. Volevo farmi un’idea di quanto le parole di un testo sono anomale rispetto a sequenze di caratteri casuali: le parole appaiono spesso identiche nel testo mentre sequenze casuali (errori di battitura) sono molto rare. Allora per semplificare ho fatto l’ipotesi che le lettere dell’alfabeto avessero ciascuna una propria probabilità di apparire, e non fossero dipendenti tra loro (volevo semplificare al massimo).
Dopo un po’ di tempo ho scoperto che il problema era decisamente più difficile di quanto mi aspettassi; dopo molto tempo sono riuscito a risolverlo però in modo ricorsivo e piuttosto macchinoso. Ho deciso di provare a diffondere il problema per vedere se la mia soluzione è corretta e se qualcuno riesce a trovare una soluzione più furba che non richieda la ricorsione. Penso che per una particolare sequenza si possano comunque ottenere delle soluzioni in forma chiusa usando la “trasformata z”, ma non ho più avuto voglia di approfondire il problema.
Nei documenti dove spiego quello che ho trovato indico la piccola sequenza da cercare con il simbolo ρ mentre uso s per indicare la sequenza più lunga in cui cercare.
Ho definito diversi problemi, quello più chiaro da spiegare è la ricerca di esatamente i apparizioni di ρ nelle stringhe lunghe x caratteri: Ai(x). Dal quale si può anche facilmente ricavare la probabilità che ρ appaia al più i volte (Ni(x))
Per tornare alle soluzioni del problema che ho inviato: la sequenza abc semplifica molto il problema, le sequenze abcab o aaa sono molto più problematiche perchè si prestano a essere composte sovrapponendole: aaa si può comporre in aaaaaaaa e abcab in abcabcabcab. Con queste complicazioni trovare soluzioni con il calcolo combinatorio mi è stato impossibile.
Per trovare le soluzioni sono passato da questa idea: posso avere i apparizioni in x caratteri se esattamente a x caratteri ho l’iesima apparizione oppure se prima avevo già i apparizioni e non estraggo la i+1 esima proprio in x.
Per tener conto delle sovrapposizioni possibili ho dovuto introdurre dei coefficienti che dipendono dalla forma della ρ che si sta cercando. Qui la soluzione si trova considerando che se ρ si può comporre allora un suo pezzettino di testa si deve ripetere. Fatta questa considerazione bisogna introdurre un nuovo problema ausiliario, la probabilità di avere Ai(x) che non terminano proprio con quel pezzettino.
Per venire all’ultima domanda del quiz, se si vanno a cercare la o una delle sequenza ρ più probabile (ripetizione del carattere più probabile) e la o una delle più improbabili si possono costruire due funzioni che indicano la probabilità minima e massima che si presentino quelle apparizioni al variare di x.
Per chi avesse ancora la pazienza di giocare con il problema propongo la lettura di questo articolo
Quiz sequenze di eventi casuali
Supponi di avere una variabile casuale X da cui, ad ogni estrazione, si possono ottenere solo i valori a,b,c con probabilità Pa=0,5 Pb=0,3 e Pc=0,2. Supponi inoltre che ogni estrazione sia indipendente dalla successiva.
Ora prova ad estrarre una sequenza di 10 eventi da questa variabile casuale, potresti per esempio ottenere abbaabcacb; in questa sequenza è presente la sottosequenza abc.
Qual’è la probabilità di non trovare mai la sequenza abc in tutte le possibili estrazioni di 10 eventi? [Ai(x) = {probabilità che la sequenza appaia i volte in estrazioni di lunghezza x} A0(10) = 0,773392] e di trovarla una volta? [A1(10) = 0,213324]
Come cambiano la probabilità passando da 10 a 11 o 12 estrazioni? [A0(11)=0,748630 A0(12)=0,724661; A1(11)=0,233010 A1(12)=0,251217]
Che cosa cambia se invece di abc si cerca aaa oppure abcab?
[per aaa]
| x | A0(x) | A1(x) |
| 10 | 0,94765056 | 0,04272947 |
| 11 | 0,94146527 | 0,04749001 |
| 12 | 0,93532035 | 0,05218658 |
[per abcab]
| x | A0(x) | A1(x) |
| 10 | 0,97456522 | 0,02494956 |
| 11 | 0,97043247 | 0,02890066 |
| 12 | 0,96631838 | 0,03281444 |
Esistono un limite minimo e uno massimo alla probabilità di trovare una sola volta una sequenza di tre eventi in sequenze di x elementi?
Tips Netezza
Netezza è un potente quanto sconosciuto database per datawharehouse, ora acquisito da IBM e bastato su postrgresql con cui condivide molti comandi e funzioni sql.
Per accedervi si può usare Eclipse e il driver jdbc, però con alcuni impicci, tra i quali non poter vedere i sorgenti delle viste.
Per risolvere il problema
SELECT definition FROM _v_view WHERE viewname=’NOME_VISTA’
UnxUtils
Magagna del giorno: convincere uno script perl linux a girare sotto windows.
Per fortuna lo script è semplice e fa al massimo qualche chiamata a tool standard unix, che per fortuna sono facilissimi da trovare per windows, ricompilati senza dover installare cygwin.
enjoy UnxUtils
EHCache
Di quando in quando capita di voler utilizzare una cache per conservare il risultato delle elaborazioni, per conservarle sino a che qualche evento non scatta: per esempio nuovi dati disponibili, una modifica su un file o semplicemente se è trascorso molto tempo da quando i dati sono stati elaborati.
Più di dieci anni fa mi ero scritto una cache con un numero limitato di entry, che scartava gli elementi più vecchi. Mi ha servito degnamente per anni ed anni, questa volta invece di continuare a riciclarla ho deciso di fare un giro su google per vedere quali mirabolanti framework java sono usciti in questi anni.
Una delle prime pagine che si trovano è una directory di cache java purtroppo molte delle quali sono morte e defunte o no hanno più nulla da aggiungere da diversi anche, come la vecchia oscache di cui avevo sentito parlare tanto tempo fa.
Una carina che ho trovato si chiama EHCache, parte delle funzionalità sono gratuite (quelle che servono normalmente) mentre altre richiedono una licenza. Visto che a me serve poco più che limitare lo spazio in memoria per i dati ho deciso di provarla.
basta scaricare i jar e metterli nel progetto, copiare il file di configurazione ehcache.xml nella radice dei sorgenti e fare qualche minima modifica – spegnere il supporto per la cache distribuita terracotta che è molto oltre le mie necessità. Per fare questo basta commentare tutte i tag <terracotta/> che si trovano nelle cache di esempio.
Poi nelle classi java bastano un paio di linee di codice
CacheManager cacheManager;
Ehcache cache;cacheManager = CacheManager.newInstance();
cache = cacheManager.getEhcache(“sampleCache2”);
per inizializzare (solo la prima volta) la chache, e poi per inserivi i dati
cache.put(new Element(chiave,oggettoDaSalvare));
invece per leggere
Element cacheElement = cache.get(chiave);
if (cacheElement!=null) {
logger.finest(“cache hit”);
return (MyValueObject) cacheElement.getObjectValue();
}
Niente di più complicato di cosi!