I'm using a plugin really useful: code.google.com/p/eclipse-fullscreen.
Some months ago i've configured gnome to force fullscreen mode to the foreground window pressing alt+f11: with gconf-editor go to /apps/metacity/window_keybindings/ and configure key binging for toggle_fullscreen. That was really necessary for my 10'' netbook (Dell Mini 10v).
But this is a generic solution, for example the fullscreen mode of firefox is far better than using metacity fullscreen (it makes disappear not only the window border, but also the navigation menu, the toolbar and the status bar).
For eclipse is almost the same: metacity fullscreen is really good, but the plugin rocks!
And a useful collateral effect is that in fullscreen mode i do not receive all the notifications from gnome (liferea, updates, rhythmbox..) and i can really get into my "coding flow"..
Visualizzazione post con etichetta programmazione. Mostra tutti i post
Visualizzazione post con etichetta programmazione. Mostra tutti i post
lunedì 23 novembre 2009
Eclipse Fullscreen plugin
Etichette:
consigli,
eclipse,
nerd,
programmazione
martedì 19 maggio 2009
[HOWTO] Immagini con testo dinamico in PHP con GD
Ormai i miei pochi lettori avranno capito che passo da un argomento all'altro senza alcuna logica, ma salto da una tematica all'altra in base ai vari progetti che seguo contemporaneamente (che senso avrebbe lavorare in partita iva per una sola azienda?) oppure in base a miei interessi o mie ricerche personali.
In questo caso si tratta di lavoro: fare un'immagine di sfondo con un testo configurabile che viene scritto in una certa area. In PHP
Pensavo fosse una cosa complessa.. invece l'ho preparato in 5 minuti:
That's all folks
In questo caso si tratta di lavoro: fare un'immagine di sfondo con un testo configurabile che viene scritto in una certa area. In PHP
Pensavo fosse una cosa complessa.. invece l'ho preparato in 5 minuti:
<?php
// Imposto l'header http
header("Content-type: image/png");
// carico lo sfondo
$im = ImageCreateFromPng('sfondo1.png');
// trovo l'indice del bianco nella palette
// (il colore della scritta)
$white = imagecolorexact($im, 255, 255, 255);
// imposto il font (questo è il path dei font di magento,
// ma è possibile mettere un ttf a scelta)
$font_file='./lib/LinLibertineFont/LinLibertine_It-2.8.2.ttf';
// testo esemplificativo (poi sarà valorizzato in base a query
// o a input dell'utente)
$msg_text = "Hello World\nCome va?";
// posizione da cui parto a scrivere
$x=50;
$y=50;
// passo tutto alla funzione imagefttext con 12pt di grandezza font e
// angolo 0 (normale da sx a dx)
imagefttext($im,12,0, $x, $y, $white, $font_file, $msg_text);
// invio la png risultante
ImagePNG($im);
// libero la risorsa
ImageDestroy($im);
?>
That's all folks
martedì 17 marzo 2009
[HOWTO] PL/SQL: cursore dinamico (con parametro)
Dato che in rete non avevo trovato nulla di veramente chiarificatore a riguardo, posto qualche riga di PL/SQL su come ho risolto il problema di fare un cursore dinamico. Il codice seguente ovviamente è una versione semplificata di quello che ho scritto realmente, ma è giusto per far capire il concetto..
visto che non è possibile dichiarare un cursore senza inizializzarlo, ho creato due cursori nel seguente modo:
e all'interno del codice si usa semplicemente così::
visto che non è possibile dichiarare un cursore senza inizializzarlo, ho creato due cursori nel seguente modo:
CREATE OR REPLACE FUNCTION calcolaQualcosa RETURN NUMBER IS
cursor categorie is select categoria from catalogo where;
cursor prodotti(p_param varchar2) is select distinct prodotto from prodotti where categoria = p_param;
BEGIN
...
e all'interno del codice si usa semplicemente così::
for i in categorie loop
for j in prodotti(i.categoria) loop
dbms_output.put_line('Categoria: ' || i.categoria || 'Prodotto: ' || j.prodotto);
end loop;
end loop;
martedì 11 novembre 2008
JQuery + thickbox con url dinamici
Ormai da tempo mi affido a jQuery per rendere più dinamica l'interfaccia grafica e non preoccuparmi della portabilità, dopo aver perso il sonno causa browser assolutamente non standard (che non nominerò, ma già sapete..).
Oggi mi trovo a dover sostituire, in un sito abbastanza recente, un parte fatta a popup con una più elegante e moderna versione ajax con tanto di thickbox, plugin che ho usato già per altri lavori.
Il problema è il seguente: allo stato attuale, all'href del link è associato una funzione javascript (selectSite()) che carica parametri in base a selezioni fatte dall'utente in diverse parti della pagina, crea un url con questi parametri e apre un "simpatico" popup con la pagina generata dinamicamente.
Ora, se attivo thickbox direttamente su questo link, esso cambierà l'href associato.
Il risultato è che se poi si cambiano i parametri nel resto del form, un click sul link genererà comunque la richiesta con i vecchi parametri. All'inizio ho pensato a come associare una callback alla chiusura della finestra thickbox per rimettere di nuovo la funzione "selectSite()" all'href del link in questione. Ma mi sembrava un po' macchinosa, soprattutto contando che esistono altri link del genere, con funzioni simili ("selectService()", "selectSupplier()".. etc).
Allora ho pensato di indirizzare il mio refactor in una direzione differente: lasciare intatto il link, ma usarne uno di appoggio fatto apposta per aprire il thickbox e niente più.
Quindi ho creato un link vuoto ed invisibile () ed una funzione a cui si appoggiano selectSite e le sue sorelle:
Vediamo cosa fa nel dettaglio:
* prepara l'href a partire dall'url (che prima veniva richiamato come popup)
* cerca il link nascosto; se è la prima richiesta aggiungo la classe "thickbox" al link nascosto ed inizializzo thickbox, questo perchè la pagina stessa viene chiamata attraverso ajax e messa dentro un div con innerHTML, quindi l'unico modo per inizializzare thickbox è lanciare l'init dopo il caricamento del contenuto (una callback sull'avvenuto inserimento) oppure on-demand.
* aggiorno l'href del link nascosto e lancio un click su questo.
In questo modo l'href viene aggiornato costantemente, i link non vengono toccati ed il mio refactor va a sostituire i window.open(url) con loadAjaxThickbox(url).. non male, direi..
Ora miglioro alcune cose:
* potrei creare direttamente il link con id HiddenLink in questa funzione
* lancio tb_init('a#HiddenLink') per non appesantire nel caso ci siano diversi thickbox nella pagina
* aggiungo altri parametri per rendere più flessibile la gestione della finestra (altezza, larghezza, modal..)
Oggi mi trovo a dover sostituire, in un sito abbastanza recente, un parte fatta a popup con una più elegante e moderna versione ajax con tanto di thickbox, plugin che ho usato già per altri lavori.
Il problema è il seguente: allo stato attuale, all'href del link è associato una funzione javascript (selectSite()) che carica parametri in base a selezioni fatte dall'utente in diverse parti della pagina, crea un url con questi parametri e apre un "simpatico" popup con la pagina generata dinamicamente.
Ora, se attivo thickbox direttamente su questo link, esso cambierà l'href associato.
Il risultato è che se poi si cambiano i parametri nel resto del form, un click sul link genererà comunque la richiesta con i vecchi parametri. All'inizio ho pensato a come associare una callback alla chiusura della finestra thickbox per rimettere di nuovo la funzione "selectSite()" all'href del link in questione. Ma mi sembrava un po' macchinosa, soprattutto contando che esistono altri link del genere, con funzioni simili ("selectService()", "selectSupplier()".. etc).
Allora ho pensato di indirizzare il mio refactor in una direzione differente: lasciare intatto il link, ma usarne uno di appoggio fatto apposta per aprire il thickbox e niente più.
Quindi ho creato un link vuoto ed invisibile () ed una funzione a cui si appoggiano selectSite e le sue sorelle:
function loadAjaxContent(url) {
var urlPar = url + "&height=500&width=800";
var nodeId = '#HiddenLink';
if(!$(nodeId).hasClass( "thickbox" )) {
$(nodeId).addClass("thickbox");
tb_init('a.thickbox');
}
$(nodeId).attr("href", urlPar);
$(nodeId).click();
}
Vediamo cosa fa nel dettaglio:
* prepara l'href a partire dall'url (che prima veniva richiamato come popup)
* cerca il link nascosto; se è la prima richiesta aggiungo la classe "thickbox" al link nascosto ed inizializzo thickbox, questo perchè la pagina stessa viene chiamata attraverso ajax e messa dentro un div con innerHTML, quindi l'unico modo per inizializzare thickbox è lanciare l'init dopo il caricamento del contenuto (una callback sull'avvenuto inserimento) oppure on-demand.
* aggiorno l'href del link nascosto e lancio un click su questo.
In questo modo l'href viene aggiornato costantemente, i link non vengono toccati ed il mio refactor va a sostituire i window.open(url) con loadAjaxThickbox(url).. non male, direi..
Ora miglioro alcune cose:
* potrei creare direttamente il link con id HiddenLink in questa funzione
* lancio tb_init('a#HiddenLink') per non appesantire nel caso ci siano diversi thickbox nella pagina
* aggiungo altri parametri per rendere più flessibile la gestione della finestra (altezza, larghezza, modal..)
venerdì 18 luglio 2008
Java: Filter Servlet
Il bello di usare i Filter in java è che deleghi una serie di controlli che sarebbero da replicare nelle varie action struts (o pagine JSP, o altre servlet) al filtro.
Questo può servire sia come controllo sulla sessione sia come controllo di sicurezza.
Molto spesso mi son trovato a contatto con applicazioni (e sicuramente è un errore che ho fatto anch'io, eh) che non effettuano il controllo sul corretto stato della sessione in alcune aree dell'applicazione web. Per cui c'è la possiblità che alcuni punti di entrata non previsti (passando per esempio dalla cronologia del browser o da un bookmark) non effettuino i dovuti controllo.
Per tagliare la testa al toro allora si può implementare un filtro del genere che funzioni con una whitelist interna (il metodo userNotNeeded(uri)) in cui ci sono tutti gli url (quindi le funzionalità, per intenderci) che possono essere richieste anche senza utente loggato in sessione.
Quello che non passa il controllo viene rediretto alla pagina di errore
Niente di particolarmente sofisticato, ma può tornare utile..
Questo può servire sia come controllo sulla sessione sia come controllo di sicurezza.
Molto spesso mi son trovato a contatto con applicazioni (e sicuramente è un errore che ho fatto anch'io, eh) che non effettuano il controllo sul corretto stato della sessione in alcune aree dell'applicazione web. Per cui c'è la possiblità che alcuni punti di entrata non previsti (passando per esempio dalla cronologia del browser o da un bookmark) non effettuino i dovuti controllo.
Per tagliare la testa al toro allora si può implementare un filtro del genere che funzioni con una whitelist interna (il metodo userNotNeeded(uri)) in cui ci sono tutti gli url (quindi le funzionalità, per intenderci) che possono essere richieste anche senza utente loggato in sessione.
Quello che non passa il controllo viene rediretto alla pagina di errore
public class UserBeanFilter implements Filter {
[..]
public void doFilter(ServletRequest req, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
UserBean user = (UserBean)request.getSession().getAttribute(USER_BEAN);
String uri = request.getRequestURI();
if ( (user != null) || userNotNeeded(uri)) {
logger.trace("Session ok for " + uri);
chain.doFilter(request, response);
} else {
RequestDispatcher rd = request.getRequestDispatcher(ERROR_PAGE);
logger.warn("Session required for " + uri);
rd.forward(request, response);
}
}
}
Niente di particolarmente sofisticato, ma può tornare utile..
mercoledì 18 giugno 2008
Esportare feed da liferea
Ecco quello che è uscito dopo un po' di lavoro su liferea ed il suo database sqlite..
In questo modo si ha un file html feed-$mese-$giorno.html da spostare sullo smart phone, per leggere i feed allegramente in treno.
il formato per ogni entry è:
riga col titolo
riga con l'url
testo
TODO:
* sostituire i caratteri particolari (apici inversi) che si sputtanano
* rimuovere tutti gli http:// interni (per le immagini soprattutto) per poterlo visualizzare offline
* evidenziare meglio il titolo (spaziato da quello sopra e magari bold)
* provare ad aggiungere un foglio di stile
MIGLIORIE POSSIBILI
* sqlite supporta altri formati di esportazione, provare se viene più leggibile lo script (tipo la riscrittura dei tag) con altri formati (anche se saltano fuori altri problemi.. tipo il csv che non sostiuisce le virgole interne..)
#!/bin/bash
FILENAME=feed-`date +%m-%d`.html
DATABASE=$HOME/.liferea_1.4/liferea.db
echo -e '<html>\n' > $FILENAME
echo -e '<body>\n\t<table>' >> $FILENAME
sqlite3 -html $DATABASE "select title, source, description from items where read = 0;" | sed 's/^<TD>/<\/TR><TR><TD>/' | sed 's/\</</g' | sed 's/&amp;/\&/g' >> $FILENAME
echo -e '\n\t</table></body></html>' >> $FILENAME
In questo modo si ha un file html feed-$mese-$giorno.html da spostare sullo smart phone, per leggere i feed allegramente in treno.
il formato per ogni entry è:
riga col titolo
riga con l'url
testo
TODO:
* sostituire i caratteri particolari (apici inversi) che si sputtanano
* rimuovere tutti gli http:// interni (per le immagini soprattutto) per poterlo visualizzare offline
* evidenziare meglio il titolo (spaziato da quello sopra e magari bold)
* provare ad aggiungere un foglio di stile
MIGLIORIE POSSIBILI
* sqlite supporta altri formati di esportazione, provare se viene più leggibile lo script (tipo la riscrittura dei tag) con altri formati (anche se saltano fuori altri problemi.. tipo il csv che non sostiuisce le virgole interne..)
giovedì 24 gennaio 2008
log4j 1.2.12 e log level trace
La versione di log4j in oggetto aveva evidentemente un buco enorme nella gestione del trace. Infatti dopo un bel po' di tempo perso a capire come mai il livello trace aveva un comportamento anomalo, ho aggiornato la versione di log4j, senza cambiare una virgola del codice, e tutto è andato a posto.
I sintomi erano: una configurazione giusta caricata correttamente ( testato con i metodi logger.isTraceEnabled(), isDebugEnabled...) ed un livello trace che nei file di log si presentava con un ottimo "?" al posto del nome della classe a cui il logger è associato.
Aggiornando la libreria è sparito il problema. Evviva il progresso...
I sintomi erano: una configurazione giusta caricata correttamente ( testato con i metodi logger.isTraceEnabled(), isDebugEnabled...) ed un livello trace che nei file di log si presentava con un ottimo "?" al posto del nome della classe a cui il logger è associato.
Aggiornando la libreria è sparito il problema. Evviva il progresso...
lunedì 10 dicembre 2007
L'importanza di loggare
Visto che sto cercando il modo migliore per utilizzare il package java.util.logging (JUL) per il mio progetto u4j2rsf, spendo due secondi per sottolineare l'importanza di usare una infrastruttura di logging all'interno delle applicazioni.
Da tempo ormai uso log4j per java e devo dire che mi trovo davvero bene. Ho usato anche commons logging ed ora sto provando ad usare direttamente il package JUL, già incluso nella jdk.
Il concetto alla base è il seguente: nel codice inserisco dei comandi di questo framework per tracciarne l'esecuzione e verificare il contenuto degli oggetti o delle variabili centrali su cui si svolge l'esecuzione del programma.
Questi comandi definiscono una priorità, per esempio log4j ha trace, debug, info, warning, error e critical, il JUL usa altri termini: finest, finer, fine, config info, warning e severe, ma il concetto è lo stesso.
In base ad un file di configurazione, posso decidere fino a quali messaggi stampare, per cui in fase di sviluppo vorrò leggere almeno i debug, se non proprio i trace, mentre in produzione posso limitarmi ai warning, in caso di problemi posso abbassare la priorità e monitorare meglio i file di log.
Ma ovviamente non finisce qui la questione: posso definire diverse destinazioni per i log. Per esempio posso stamparli in console, su file o addirittura (log4j) spedirli via mail.
Framework del genere esistono per tutti i linguaggi (pure javascript, per intenderci..), non appesantiscono più di tanto l'esecuzione del programma ma rendono la fase di debug meno stressante e, secondo me, l'attività di log è un fattore importante per valutare la qualità di un software.
Da tempo ormai uso log4j per java e devo dire che mi trovo davvero bene. Ho usato anche commons logging ed ora sto provando ad usare direttamente il package JUL, già incluso nella jdk.
Il concetto alla base è il seguente: nel codice inserisco dei comandi di questo framework per tracciarne l'esecuzione e verificare il contenuto degli oggetti o delle variabili centrali su cui si svolge l'esecuzione del programma.
Questi comandi definiscono una priorità, per esempio log4j ha trace, debug, info, warning, error e critical, il JUL usa altri termini: finest, finer, fine, config info, warning e severe, ma il concetto è lo stesso.
In base ad un file di configurazione, posso decidere fino a quali messaggi stampare, per cui in fase di sviluppo vorrò leggere almeno i debug, se non proprio i trace, mentre in produzione posso limitarmi ai warning, in caso di problemi posso abbassare la priorità e monitorare meglio i file di log.
Ma ovviamente non finisce qui la questione: posso definire diverse destinazioni per i log. Per esempio posso stamparli in console, su file o addirittura (log4j) spedirli via mail.
Framework del genere esistono per tutti i linguaggi (pure javascript, per intenderci..), non appesantiscono più di tanto l'esecuzione del programma ma rendono la fase di debug meno stressante e, secondo me, l'attività di log è un fattore importante per valutare la qualità di un software.
sabato 8 dicembre 2007
WebService per cambio valute
Io adoro i web service. L'idea che Internet venga usato come rete di servizi invece che rete di informazioni la trovo interessante.
E non per niente, su questo argomento, ci ho fatto la tesi della laurea di primo livello.
Ed ora, dopo tre anni, mi trovo ad usarli per la prima volta in ambito lavorativo. Altri progetti in cui avevo proposto di utilizzarli non sono mai partiti. Invece ora devo accedere al più classico dei web service: il cambio di valuta.
Dopo un po' di giri per la rete ecco qui quello che fa al caso mio: http://www.webservicex.net/WS/WSDetails.aspx?CATID=2&WSID=10.
c'è anche, ovviamente, il link al descrittore del webservice: il WSDL.
In pochi step riesco ad accedervi dal mio codice java:
- scaricare apache axis
- dare in pasto il descrittore a WSDL2Java, che genera classi java per accedere al web service lì descritto: java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/CurrencyConvertor.asmx?WSDL (dopo aver messo i jar di axis nel classpath)
- importare le classi generate nel mio progetto
- utilizzare le classi:
CurrencyConvertor convertor = new CurrencyConvertorLocator();
double rate = convertor.getCurrencyConvertorSoap().conversionRate(Currency.EUR, Currency.USD);
Ed il gioco è fatto: attraverso il contenuto del WSDL, axis ha generato il metodo conversionRate che effettua (su un protocollo condiviso in formato xml, SOAP) la chiamata "ConversionRate" al webservice passandogli due Currency come parametri, e ricevendo come risposta un double.
In questo modo io non so com'è la logica dietro all'esecuzione del metodo, ma so che ci posso accedere tranquillamente ed essendo tutto basato su XML, ho l'interoperabilità tra linguaggi, per cui, per esempio, posso scrivere un web service in Java ed accedervi da Perl.
E non per niente, su questo argomento, ci ho fatto la tesi della laurea di primo livello.
Ed ora, dopo tre anni, mi trovo ad usarli per la prima volta in ambito lavorativo. Altri progetti in cui avevo proposto di utilizzarli non sono mai partiti. Invece ora devo accedere al più classico dei web service: il cambio di valuta.
Dopo un po' di giri per la rete ecco qui quello che fa al caso mio: http://www.webservicex.net/WS/WSDetails.aspx?CATID=2&WSID=10.
c'è anche, ovviamente, il link al descrittore del webservice: il WSDL.
In pochi step riesco ad accedervi dal mio codice java:
- scaricare apache axis
- dare in pasto il descrittore a WSDL2Java, che genera classi java per accedere al web service lì descritto: java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/CurrencyConvertor.asmx?WSDL (dopo aver messo i jar di axis nel classpath)
- importare le classi generate nel mio progetto
- utilizzare le classi:
CurrencyConvertor convertor = new CurrencyConvertorLocator();
double rate = convertor.getCurrencyConvertorSoap().conversionRate(Currency.EUR, Currency.USD);
Ed il gioco è fatto: attraverso il contenuto del WSDL, axis ha generato il metodo conversionRate che effettua (su un protocollo condiviso in formato xml, SOAP) la chiamata "ConversionRate" al webservice passandogli due Currency come parametri, e ricevendo come risposta un double.
In questo modo io non so com'è la logica dietro all'esecuzione del metodo, ma so che ci posso accedere tranquillamente ed essendo tutto basato su XML, ho l'interoperabilità tra linguaggi, per cui, per esempio, posso scrivere un web service in Java ed accedervi da Perl.
giovedì 23 agosto 2007
Mawk, sine e lo spam sui commenti
Da parecchio tempo ormai il sito mawk è tempestato di spam sui commenti, ma mentre prima avveniva abbastanza sporadicamente, ora è un fenomeno quasi continuo.
La piattaforma su cui si basa il sito è sine cms, un progetto di 2 ragazzi italiani (di cui uno se non sbaglio girava dalle parti di hacker school). Sinceramente non ho usato questo cms a sufficienza da poterne dare un giudizio critico. Per cui mi limiterò all'ambito del problema.
Secondo me, prima di tutto, c'è qualcosa da controllare a basso livello: per esempio se si inserisce un nuovo commento cambiando il parametro hidden dell'id del post, riesco ad inserire un commento su un articolo inesistente, per prova infatti ho inserito come id del post 999. Il risultato è che è stato pubblicato tranquillamente in homepage, tra gli ultimi commenti. Un vincolo referenziale di chiave esterna eliminerebbe rapidamente questo problema delegandone la gestione al dbms, ma basterebbe anche effettuare una query sulla tabella delle news prima di accettare di inserire il commento.
Guardando la struttura del database, si nota una cosa che non mi piace molto: nella tabella dei commenti non viene loggato l'indirizzo ip. Bisognerebbe prima di tutto sapere se c'è una volontà precisa dietro questa scelta o solo una svista, ma il sito ufficiale sine è giù da mooolto tempo. Beh, cmq il modo più efficace per controllare che uno stesso utente non stia spammando è fare dei controlli sul database prima dell'inserimento della nuova entry: controllare se quell'ip ha lasciato un commento da poco tempo (poi c'è il problema di quantificare, ma vabbè)
Un'altra soluzione sarebbe tenere traccia nella sessione utente, ma è aggirabile rapidamente, cancellando i cookie di sessione, ma si può iniziare ad implementare questa per comodità e rapidità di esecuzione. E' sicuramente da valutare.
Sarebbe anche interessante capire con che UserAgent si presentano gli spammer. Su arabianfenix avevo implementato un metodo per bloccare l'inserimento di contenuti da parte di utenti senza javascript attivato, contando di intercettare e bloccare così il software dello spammer. Ma evidentemente in quel caso era un utente particolarmente simpatico che arrivava lì col proprio browser e aggiungeva un commento con decine di link.. che fondamentalmente non può essere bloccato. Invece nel caso di mawk pare più una cosa automatica, anche perchè vengono inseriti una sessantina di commenti a botta, per cui una soluzione di check prima di inserire è assolutamente da introdurre.
Il tutto per tentare di porre limiti all'attività degli spammer, prima di cominciare a mettere gli odiosissimi captcha..
La piattaforma su cui si basa il sito è sine cms, un progetto di 2 ragazzi italiani (di cui uno se non sbaglio girava dalle parti di hacker school). Sinceramente non ho usato questo cms a sufficienza da poterne dare un giudizio critico. Per cui mi limiterò all'ambito del problema.
Secondo me, prima di tutto, c'è qualcosa da controllare a basso livello: per esempio se si inserisce un nuovo commento cambiando il parametro hidden dell'id del post, riesco ad inserire un commento su un articolo inesistente, per prova infatti ho inserito come id del post 999. Il risultato è che è stato pubblicato tranquillamente in homepage, tra gli ultimi commenti. Un vincolo referenziale di chiave esterna eliminerebbe rapidamente questo problema delegandone la gestione al dbms, ma basterebbe anche effettuare una query sulla tabella delle news prima di accettare di inserire il commento.
Guardando la struttura del database, si nota una cosa che non mi piace molto: nella tabella dei commenti non viene loggato l'indirizzo ip. Bisognerebbe prima di tutto sapere se c'è una volontà precisa dietro questa scelta o solo una svista, ma il sito ufficiale sine è giù da mooolto tempo. Beh, cmq il modo più efficace per controllare che uno stesso utente non stia spammando è fare dei controlli sul database prima dell'inserimento della nuova entry: controllare se quell'ip ha lasciato un commento da poco tempo (poi c'è il problema di quantificare, ma vabbè)
Un'altra soluzione sarebbe tenere traccia nella sessione utente, ma è aggirabile rapidamente, cancellando i cookie di sessione, ma si può iniziare ad implementare questa per comodità e rapidità di esecuzione. E' sicuramente da valutare.
Sarebbe anche interessante capire con che UserAgent si presentano gli spammer. Su arabianfenix avevo implementato un metodo per bloccare l'inserimento di contenuti da parte di utenti senza javascript attivato, contando di intercettare e bloccare così il software dello spammer. Ma evidentemente in quel caso era un utente particolarmente simpatico che arrivava lì col proprio browser e aggiungeva un commento con decine di link.. che fondamentalmente non può essere bloccato. Invece nel caso di mawk pare più una cosa automatica, anche perchè vengono inseriti una sessantina di commenti a botta, per cui una soluzione di check prima di inserire è assolutamente da introdurre.
Il tutto per tentare di porre limiti all'attività degli spammer, prima di cominciare a mettere gli odiosissimi captcha..
Iscriviti a:
Post (Atom)