ago
19

Il passaggio della ISS via RSS

 

Il programma che ho scritto nelle ultime ore, permette di creare dei feed RSS (quelli che si sottoscrivono solitamente per ricevere notizie da varie fonti) che ci informano del passaggo della ISS (ovvero della Stazione Spaziale Internazionale) sopra la nostra testa.
Una volta inseriti nel file i link reperibili sul sito dell ESA (Agenzia Spaziale Europea) il programma genererà i feed rss e li pubblicherà su un piccolo server web privato.
Il programma contiene molte opzioni, ed è facilmente configurabile (ho pure messo un discreto numero di
commenti stavolta :) ).
E importante (soprattutto se permettete agli altri di accedere al server web) creare una cartella adhoc dove posizionare il programma, in quanto verranno condivisi tutti i file e le cartelle presenti.
Il programma necessita della libreria BeautifulSoup.

Per qualsiasi dubbio o problema potete, come sempre, lasciarmi un commento.

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright 2011 Francesco Frassinelli
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
### Configurazione - Inizio
# N.B.: Tutti i tempi sono espressi in secondi
 
# Questa lista contiene tutti i link relativi alle posizioni
# Link presi da: http://esa.heavens-above.com/countries.aspx
# Per prendere un nuovo link bisogna:
#  1. Andare su http://esa.heavens-above.com/countries.aspx
#  2. Selezionare la nazione
#  3. Digitare il nome del paese
#  4. Premere  Submit 
#  5. Premere sul link del paese (solitamente il primo a sinistra)
#  6. Copiare il link  ISS  (si trova tra le previsioni a dieci giorni)
#  7. Incollare il link nella lista sottostante, similmente agli altri
urls = (
    'http://esa.heavens-above.com/PassSummary.aspx?satid=25544&lat=43.800&lng=7.650&loc=Vallecrosia&alt=53&tz=CET',
    'http://esa.heavens-above.com/PassSummary.aspx?satid=25544&lat=43.950&lng=8.133%20&loc=Marina+di+Andora&alt=0&tz=CET',
    'http://esa.heavens-above.com/PassSummary.aspx?satid=25544&lat=45.483&lng=9.367&loc=Vignate&alt=110&tz=CET',
)
 
# A chi voui fare vedere i feed?
# Impostare host su  0.0.0.0  per renderli visibili a tutti
host =  localhost 
 
# Porta del server
# Su Unix solitamente le porte minori di 1024 sono riservate
port = 1912
 
# Tempo di refresh dei feed
interval = 60*60
 
# Tempo dell auto riavvio del server in caso di problemi di rete
autoReboot = 60
 
# Le informazioni contenute in ogni elemento del feed
# Puoi utilizzare tutte le parole chiave presenti in self.keys
rssItem = (
    '  <item>
 ,
    '   <title>[%(date)s - %(start_time)s]'
        ' Magnitudine apparente: %(magnitude)s</title>
 ,
    '   <description>
 ,
          Evento di magnitude %(magnitude)s%(br)s
  ,
          Inizio previsto alle %(start_time)s 
          in direzione %(start_azimuth)s%(br)s
 ,
          Altezza massima previta alle %(max_time)s 
          in direzione %(max_azimuth)s%(br)s
 ,
          Fine prevista alle %(end_time)s 
          in direzione %(end_azimuth)s%(br)s
 ,
    '   </description>
 ,
    '   <link>%(link)s</link>
 ,
    '  </item>
 ,
)
### Configurazione - Fine
 
from BeautifulSoup import BeautifulSoup
from cgi import escape, parse_qs
from os import devnull, execl
from urllib2 import urlopen, urlparse
from SimpleHTTPServer import SimpleHTTPRequestHandler
from socket import error
from SocketServer import TCPServer
from sys import argv, executable, exit, stdout
from threading import Thread, Event
from time import localtime, sleep, strftime, strptime
 
def debug(message):
    print(   .join((strftime( [%d/%m/%y - %H:%M:%S] ), message)))
 
class UpdateFeed(Thread):
    def __init__(self, urls, interval):
        Thread.__init__(self)
        self.event = Event()
        self.urls = urls
        self.interval = interval
        self.keys = [
             magnitude ,
             start_time ,
             start_altitude ,
             start_azimuth ,
             max_time ,
             max_altitude ,
             max_azimuth ,
             end_time ,
             end_altitude ,
             end_azimuth ,
        ]
        self.tags = { br :escape('<br />')}
    def shutdown(self):
        self.event.set()
    def run(self):
        while 1:
            if self.event.isSet():
                return
            self.task()
            self.event.wait(self.interval)
    def task(self):
        for url in self.urls:
            args = parse_qs(urlparse.urlparse(url).query)
            args = dict((key, value[0]) for key, value in args.iteritems())
            name = [part.capitalize() for part in args[ loc ].split()]
            args[ loc ] =    .join(name)
            data = self.getPasses(url, args)
            if data == None:
                break
            with open( %(loc)s.xml  % args,  wb ) as feed:
                self.xmlOutput(feed, data, args)
            debug( Aggiornato il feed %(loc)s.xml  % args)
    def getPasses(self, url, args):
        try:
            raw = urlopen(url).read()
        except:
            debug( Errore di rete )
            reboot()
        soup = BeautifulSoup(raw)
        for row in soup.findAll( tr , { class :[ lightrow ,  darkrow ]}):
            elements = row.findAll( td )
            values = [item.string for item in elements[1:]]
            result = dict(zip(self.keys, values))
            result[ date ] = elements[0].a.string
            escaped = escape(dict(row.td.a.attrs)[ href ])
            result[ link ] = urlparse.urljoin(url, escaped)
            event =    .join((
                strftime( %Y ),
                args[ tz ],
                result[ date ],
                result[ end_time ]
            ))
            eventTime = strptime(event,  %Y %Z %d %b %H:%M:%S )
            if eventTime < localtime():
                continue
            yield result
    def xmlOutput(self, feed, data, args):
        lines = (
            '<?xml version="1.0" encoding="UTF-8"?>
 ,
            '<rss version="2.0"'
                ' xmlns:atom="http://www.w3.org/2005/Atom">
 ,
            ' <atom:link href="http://dallas.example.com/rss.xml"'
                ' rel="self" type="application/rss+xml" />
 
            ' <channel>
 ,
            '  <title>Guarda la ISS da %(loc)s</title>
 ,
            '  <link>http://frafra.eu</link>
 ,
            '  <description>Tutti i passaggi visibili della ISS'
                ' nei prossimi dieci giorni</description>
 ,
        )
        feed.writelines((string % args for string in lines))
        for result in data:
            result.update(self.tags)
            feed.writelines((string % result for string in rssItem))
        feed.writelines((
            ' </channel>
 ,
            '</rss>
 ,
            ))
 
def startServer(host, port):
    httpd = TCPServer((host, port), SimpleHTTPRequestHandler)
    debug( Server attivo sulla porta %s aperto a %s  % (port, host))
    debug( Server disponibile su http://localhost:%s/  % port)
    httpd.serve_forever()
 
def reboot():
    debug( Riavvio il programma tra %d secondi  % autoReboot)
    stdout = open(devnull, a )
    try:
        sleep(autoReboot)
    except KeyboardInterrupt:
        debug( Programma terminato )
        exit(1)
    python = executable
    execl(python, python, *argv)
 
if __name__ ==  __main__ :
    refresh = UpdateFeed(urls, interval)
    refresh.start()
    try:
        startServer(host, port)
    except KeyboardInterrupt:
        debug( Server disattivato )
    except error:
        debug( Errore nell attivazione del server )
        reboot()
    finally:
        refresh.shutdown()
        debug( Programma terminato )

Il programma è abbastanza robusto, ma non va per il sottile se la connessione diventa instabile o non disponibile, ovvero si limita ad autoriavviarsi nella speranza che questa torni a funzionare.

Per chiuderlo, basta il classico [CTRL] + [C]
Per rimuovere i feed non più utilizzati, bisogna cancellare i relativi file *.xml.

Popularity: unranked [?]



Puoi visualizzare il post originale qui.

ago
19

Notifiche via RSS del passaggio della ISS

 

Il programma che ho scritto nelle ultime ore, permette di creare dei feed RSS (quelli che si sottoscrivono solitamente per ricevere notizie da varie fonti) che ci informano del passaggo della ISS (ovvero della Stazione Spaziale Internazionale) sopra la nostra testa.
Una volta inseriti nel file i link reperibili sul sito dell ESA (Agenzia Spaziale Europea) il programma genererà i feed rss e li pubblicherà su un piccolo server web privato.
Il programma contiene molte opzioni, ed è facilmente configurabile (ho pure messo un discreto numero di
commenti sta volta :) ).
Il programma necessita della libreria BeautifulSoup.

Per qualsiasi dubbio o problema potete, come sempre, lasciarmi un commento.

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright 2011 Francesco Frassinelli
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
### Configurazione - Inizio
# N.B.: Tutti i tempi sono espressi in secondi
 
# Questa lista contiene tutti i link relativi alle posizioni
# Link presi da: http://esa.heavens-above.com/countries.aspx
# Per prendere un nuovo link bisogna:
#  1. Andare su http://esa.heavens-above.com/countries.aspx
#  2. Selezionare la nazione
#  3. Digitare il nome del paese
#  4. Premere  Submit 
#  5. Premere sul link del paese (solitamente il primo a sinistra)
#  6. Copiare il link  ISS  (si trova tra le previsioni a dieci giorni)
#  7. Incollare il link nella lista sottostante, similmente agli altri
urls = (
    'http://esa.heavens-above.com/PassSummary.aspx?satid=25544&lat=43.800&lng=7.650&loc=Vallecrosia&alt=53&tz=CET',
    'http://esa.heavens-above.com/PassSummary.aspx?satid=25544&lat=43.950&lng=8.133%20&loc=Marina+di+Andora&alt=0&tz=CET',
    'http://esa.heavens-above.com/PassSummary.aspx?satid=25544&lat=45.483&lng=9.367&loc=Vignate&alt=110&tz=CET',
)
 
# A chi voui fare vedere i feed?
# Impostare host su  0.0.0.0  per renderli visibili a tutti
host =  localhost 
 
# Porta del server
# Su Unix solitamente le porte minori di 1024 sono riservate
port = 1912
 
# Tempo di refresh dei feed
interval = 60*60
 
# Tempo dell auto riavvio del server in caso di problemi di rete
autoReboot = 60
 
# Le informazioni contenute in ogni elemento del feed
# Puoi utilizzare tutte le parole chiave presenti in self.keys
rssItem = (
    '  <item>
 ,
    '   <title>[%(date)s - %(start_time)s]'
        ' Magnitudine apparente: %(magnitude)s</title>
 ,
    '   <description>
 ,
          Evento di magnitude %(magnitude)s%(br)s
  ,
          Inizio previsto alle %(start_time)s 
          in direzione %(start_azimuth)s%(br)s
 ,
          Altezza massima previta alle %(max_time)s 
          in direzione %(max_azimuth)s%(br)s
 ,
          Fine prevista alle %(end_time)s 
          in direzione %(end_azimuth)s%(br)s
 ,
    '   </description>
 ,
    '   <link>%(link)s</link>
 ,
    '  </item>
 ,
)
### Configurazione - Fine
 
from BeautifulSoup import BeautifulSoup
from cgi import escape, parse_qs
from os import devnull, execl
from urllib2 import urlopen, urlparse
from SimpleHTTPServer import SimpleHTTPRequestHandler
from socket import error
from SocketServer import TCPServer
from sys import argv, executable, exit, stdout
from threading import Thread, Event
from time import localtime, sleep, strftime, strptime
 
def debug(message):
    print(   .join((strftime( [%d/%m/%y - %H:%M:%S] ), message)))
 
class UpdateFeed(Thread):
    def __init__(self, urls, interval):
        Thread.__init__(self)
        self.event = Event()
        self.urls = urls
        self.interval = interval
        self.keys = [
             magnitude ,
             start_time ,
             start_altitude ,
             start_azimuth ,
             max_time ,
             max_altitude ,
             max_azimuth ,
             end_time ,
             end_altitude ,
             end_azimuth ,
        ]
        self.tags = { br :escape('<br />')}
    def shutdown(self):
        self.event.set()
    def run(self):
        while 1:
            if self.event.isSet():
                return
            self.task()
            self.event.wait(self.interval)
    def task(self):
        for url in self.urls:
            args = parse_qs(urlparse.urlparse(url).query)
            args = dict((key, value[0]) for key, value in args.iteritems())
            name = [part.capitalize() for part in args[ loc ].split()]
            args[ loc ] =    .join(name)
            data = self.getPasses(url, args)
            if data == None:
                break
            with open( %(loc)s.xml  % args,  wb ) as feed:
                self.xmlOutput(feed, data, args)
            debug( Aggiornato il feed %(loc)s.xml  % args)
    def getPasses(self, url, args):
        try:
            raw = urlopen(url).read()
        except:
            debug( Errore di rete )
            reboot()
        soup = BeautifulSoup(raw)
        for row in soup.findAll( tr , { class :[ lightrow ,  darkrow ]}):
            elements = row.findAll( td )
            values = [item.string for item in elements[1:]]
            result = dict(zip(self.keys, values))
            result[ date ] = elements[0].a.string
            escaped = escape(dict(row.td.a.attrs)[ href ])
            result[ link ] = urlparse.urljoin(url, escaped)
            event =    .join((
                strftime( %Y ),
                args[ tz ],
                result[ date ],
                result[ end_time ]
            ))
            eventTime = strptime(event,  %Y %Z %d %b %H:%M:%S )
            if eventTime < localtime():
                continue
            yield result
    def xmlOutput(self, feed, data, args):
        lines = (
            '<?xml version="1.0" encoding="UTF-8"?>
 ,
            '<rss version="2.0"'
                ' xmlns:atom="http://www.w3.org/2005/Atom">
 ,
            ' <atom:link href="http://dallas.example.com/rss.xml"'
                ' rel="self" type="application/rss+xml" />
 
            ' <channel>
 ,
            '  <title>Guarda la ISS da %(loc)s</title>
 ,
            '  <link>http://frafra.eu</link>
 ,
            '  <description>Tutti i passaggi visibili della ISS'
                ' nei prossimi dieci giorni</description>
 ,
        )
        feed.writelines((string % args for string in lines))
        for result in data:
            result.update(self.tags)
            feed.writelines((string % result for string in rssItem))
        feed.writelines((
            ' </channel>
 ,
            '</rss>
 ,
            ))
 
def startServer(host, port):
    httpd = TCPServer((host, port), SimpleHTTPRequestHandler)
    debug( Server attivo sulla porta %s aperto a %s  % (port, host))
    debug( Server disponibile su http://localhost:%s/  % port)
    httpd.serve_forever()
 
def reboot():
    debug( Riavvio il programma tra %d secondi  % autoReboot)
    stdout = open(devnull, a )
    try:
        sleep(autoReboot)
    except KeyboardInterrupt:
        debug( Programma terminato )
        exit(1)
    python = executable
    execl(python, python, *argv)
 
if __name__ ==  __main__ :
    refresh = UpdateFeed(urls, interval)
    refresh.start()
    try:
        startServer(host, port)
    except KeyboardInterrupt:
        debug( Server disattivato )
    except error:
        debug( Errore nell attivazione del server )
        reboot()
    finally:
        refresh.shutdown()
        debug( Programma terminato )

Il programma è abbastanza robusto, ma non va per il sottile se connessione diventa instabile o non disponibile, ovvero si limita ad autoriavviarsi nella speranza che questa torni a funzionare.

Per chiuderlo, basta il classico [CTRL] + [C]
Per rimuovere i feed non più utilizzati, bisogna cancellare i relativi file *.xml.

Popularity: unranked [?]



Puoi visualizzare il post originale qui.

mag
21

Leggere meglio con Minified Pure Reader

 

Come sapete, sono un grande fan degli RSS e mi piace leggere gli articoli tramite Google Reader. Ultimamente ho cominciato a scoprire alcuni strumenti interessanti per leggere meglio, come ad esempio Readability di cui vi ho già parlato. Quasi per caso una volta mi sono imbattuto in Pure Reader, uno script originariamente sviluppato per Safari e poi portato anche a Firefox e altri browser.

http://nadesign.net/safari/images/preview-reader.png

La versione di Pure Reader originale su Safari

Per un po’ l’ho adoperato e in effetti non è male. Poi comunque ho notato qualche piccolo difetto, per esempio il fatto che venga nascosto il pulsante mi piace e altre funzioni considerate “secondarie” o che tutte le immagini vengano messe su una riga a parte, compresi gli smile. Nulla di grave comunque.

Alla fine ci ho pensato un po’ e in effetti l’interfaccia di Google Reader, semplice e in linea con le altre applicazioni di Google, non mi spiace affatto. Quello che non soddisfa in effetti è il modo con cui Google Reader visualizza il testo degli articoli. Perciò ho deciso di prendere Pure Reader per Greasemonkey e modificarlo in modo da avere soltanto gli articoli con lo stile modificato, mentre tutto il resto rimane come prima.

Minified Pure Reader

Se volete installare lo script come sempre vi basta avere Greasemonkey e poi visitare la pagina dedicata a Minified Pure Reader. Buona lettura!

Popularity: unranked [?]



Puoi visualizzare il post originale qui.

dic
07

RSS validi e robusti in bbPress

 

Nel mio precedente articolo sulle risorse più utili per bbPress vi avevo preannunciato alcuni problemi con i feed RSS, almeno quelli del tema di default (Kakumei). Credo comunque che molti temi derivati utilizzino il template degli RSS di default, in quanto non c’è poi molto da cambiare.

Questa è la lista dei problemi che ho riscontrato finora e che ho risolto (spero) nel sito che amministro:

  • Il contenuto dei messaggi non viene processato dai plugin. Se ad esempio uso il plugin che mi sostituisce le emoticon digitate con immagini di smilies, nei feed RSS continuo a vedere le emoticon testuali, e così via.
  • Una descrizione del sito lunga o con il carattere di virgoletta doppia “»” (che viene inserito automaticamente da bbPress!) spesso “rompe” l’anteprima del feed in Firefox, mentre ad esempio su Google Reader funziona.
  • Le date vengono tradotte in lingua se si usano dei file di localizzazione, violando il formato RFC-822 e quindi quello RSS.
  • Bisogna assicurarsi che il feed non contenga codice HTML puro, o in alternativa che questo venga opportunamente isolato nei tag CDATA e filtrato (c’è un problema con il carattere di spazio lungo &nbsp; per esempio).
  • Quando si prende il testo del messaggio processato dai plugin si ottiene una doppia codifica (e pure insolita) per il carattere ampersand “&”.

Bando alle ciance, questo è il codice. Dovete aprire la cartella del vostro tema, cercare il file rss2.php e sostituire integralmente il contenuto con questo:


<?php
header( 'Content-Type: text/xml; charset=UTF-8' );
echo '<' . '?xml version="1.0" encoding="UTF-8"?' . '>' . "
";
bb_generator( 'comment' );

function datefix($buffer) {
	/*
	 * fix della data in modo da tenerla in inglese, rispettando
	 * le specifiche dei feed RSS
	 */
	 return gmdate('D, d M Y H:i:s +0000', $buffer);
}

function callback($buffer)
{
	/*
	 * sistema il codice rimuovendo la doppia codifica di "&" e
	 * rimuove il carattere "&nbsp;" che crea problemi con UTF-8
	 * in questo modo ho il testo del post dopo che i plugin (tipo
	 * le faccine) hanno applicato le loro modifiche html e ritorno
	 * il codice html senza entities ma in forma pura
	 */

	$single = str_replace("&#"."038;", "&", $buffer);
	$spaced = str_replace("&nbsp;", " ", $single);
	return html_entity_decode($spaced);
}

?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><?php echo $title; ?></title>
		<link><?php echo $link; ?></link>
		<description><![CDATA[<?php echo $description; ?>]]></description>
		<language><?php esc_html( bb_option('language') ); ?></language>
		<pubDate><?php echo gmdate('D, d M Y H:i:s +0000'); ?></pubDate>
		<?php bb_generator( 'rss2' ); ?>
		<textInput>
			<title><![CDATA[<?php _e('Search'); ?>]]></title>
			<description><![CDATA[<?php _e('Search all topics from these forums.'); ?>]]></description>
			<name>q</name>
			<link><?php bb_uri('search.php'); ?></link>
		</textInput>
		<atom:link href="<?php echo $link_self; ?>" rel="self" type="application/rss+xml" />

<?php foreach ($posts as $bb_post) : ?>
		<item>
			<title><?php post_author(); ?> <?php _e('on')?> "<?php topic_title( $bb_post->topic_id ); ?>"</title>
			<link><?php post_link(); ?></link>
			<pubDate><?php

			ob_start("datefix");
			bb_post_time('U');
			ob_end_flush();

			?></pubDate>
			<dc:creator><?php post_author(); ?></dc:creator>
			<guid isPermaLink="false"><?php post_id(); ?>@<?php bb_uri(); ?></guid>
			<description><![CDATA[<?php

			ob_start("callback");
			post_text();
			ob_end_flush();

			?>]]></description>
		</item>
<?php endforeach; ?>

	</channel>
</rss>

Potete verificare che il codice generato è correttamente validato sul sito del validatore W3C. Quello del sito dei Giovani Matematici di Vicenza è valido.

[Valid RSS]

Sono contento di aver risolto i problemi del feed (sperando di non averne causati altri) ma soprattutto questo mi ha permesso di imparare qualcosa in più sul formato RSS (che mi ha sempre affascinato ma di cui non ho mai saputo nulla). Fatemi sapere se avete problemi col codice o se volete suggerirmi delle migliorie!

Popularity: unranked [?]



Puoi visualizzare il post originale qui.

mag
20

10 icone per Twitter e RSS

 

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

mag
01

Content scraping con Python: l area News dell homepage del sito della facoltà di Lettere e Filosofia dell Università di Palermo

 

Due anni fa, con una dose di brio in gran parte ingiustificato, vi ho parlato di come avevo estratto le news dal sito del mio corso di laurea. Dopo poco tempo sono successe due cose:

  1. Il sito di cui sopra è stato rifatto totalmente, e viene offerto un feed nativamente (cosa che è sempre la migliore).
  2. È venuto alla ribalta Yahoo! Pipes, un servizio di Yahoo! che permette di fare molte manipolazioni su contenuti disponibili sul web con grande facilità, usando un’interfaccia davvero intuitiva per la creazione di applicazioni ad-hoc, chiamate pipe.

M’interessava rendere fruibile tramite feed la sezione news del sito della facoltà di Lettere e Filosofia dell’Università di Palermo. In realtà, avrei usato una pipe anche stavolta, se non fosse che chi ha creato il sito, credo per evitare l’indicizzazione dei contenuti da parte dei motori di ricerca, ha deciso di utilizzare JavaScript per generare i link contenenti le notizie. Inoltre, i link generati aprono una pagina contenente un frame in linea, entro il quale si trova la notizia vera e propria.

Il problema principale risiede nel fatto che il componente del framework atto al prelievo delle pagine sembra rendere palese il fatto che, non essendo un browser vero e proprio, non supporta JavaScript. Se fosse possibile prelevare le pagine senza effettuare alcuna elaborazione, il problema sarebbe facilmente risolvibile; dal momento che non è questo il caso, bisogna ricorrere a soluzioni esterne.

Per continuare nella mia serie di incompiute, ho messo mano a Python. Quel che segue è il mio primo script, siate indulgenti: il fatto che sembri funzionare e fare ciò che cercavo non implica che sia il modo migliore in cui questo tipo di dati possa essere gestito.

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

# news_lettere_unipa.py: Gioca con la sezione news della homepage del sito della facoltà di Lettere e Filosofia dell'Università degli
# Studi di Palermo (http://lettere.unipa.it/) e ne tira fuori un feed RSS 2.0.
#
# (C) Copyright 2009 Emanuele Cipolla <mail@emanuelecipolla.net>
# This is distributed under the terms of the GNU General Public License, version 3. See http://www.gnu.org/copyleft/gpl.html for more details. 

# Non si intende infrangere il copyright della facoltà nella fornitura di questo servizio.

# Se usate Python 2.6+ non vi serve questa riga
from __future__ import with_statement 

from datetime import datetime
from ftplib import FTP
import ftplib
import os
import netrc
import calendar
import urllib
import string

def strappa(source, starttag, endtag):
# Questa funzione non fa nulla di rivoluzionario; si tratta di un piccolo "frontend" per partition(string) che
# estrae il testo contenuto
	temp = source;
	res = temp.partition(starttag);
	res = res[2].partition(endtag);
	return res[0].strip();

def acconcia(pagina, url):
# Preleviamo la parte della pagina che ci interessa e inseriamo link in posizioni opportune.
	res = strappa(pagina, "<marquee direction="up" height="200px" width="100%" behavior="scroll" scrollamount="2" onmouseover='this.stop()' onmouseout='this.start()'>", "</marquee>");
	res = res.replace("<br /><br />", "");
	res = res.replace("<img src="img/new.png" width="16" height="16" align="absmiddle"/>", "");
	res = res.replace("<a href="javascript:openWindowuffstp('", url);
	res = res.replace("popup_ufficiostampa", "popup_ufficiostampa_interno");
	res = res.replace("',", "
");
	return res.strip().splitlines();

def is_valid_url(text):
# Niente di
	try:
		urllib.urlopen(text);
	except:
		return False;

	return True;

def it_to_ctime(_string):
# Trasforma "27 settembre 2009" in "Sun, 27 Sep 2009 00:00:00 GMT". L'orario non viene settato solo perchè
# non disponibile all'origine.
	temp = _string.lower().split(" ", 3);
	res = temp[0];
	res += " ";

	if temp[1] == "gennaio":
	    res += "Jan";
	    month = 1
	elif temp[1] == "febbraio":
	    res += "Feb"
	    month = 2
	elif temp[1] == "marzo":
	    res += "Mar"
	    month = 3
	elif temp[1] == "aprile":
	    res += "Apr"
	    month = 4
	elif temp[1] == "maggio":
	    res += "May"
	    month = 5
	elif temp[1] == "giugno":
	    res += "Jun"
	    month = 6
	elif temp[1] == "luglio":
	    res += "Jul"
	    month = 7
	elif temp[1] == "agosto":
	    res += "Aug"
	    month = 8
	elif temp[1] == "settembre":
	    res += "Sep"
	    month = 9
	elif temp[1] == "ottobre":
	    res += "Oct"
	    month = 10
	elif temp[1] == "novembre":
	    res += "Nov"
	    month = 11
	elif temp[1] == "dicembre":
	    res += "Dec"
	    month = 12

	res += " ";
	day = calendar.weekday(int(temp[2]), month, int(temp[0]));

	if day == 0:  res = "Mon, " + res;
	elif day == 1: res = "Tue, " + res;
	elif day == 2: res = "Wed, " + res;
	elif day == 3: res = "Thu, " + res;
	elif day == 4: res = "Fri, " + res;
	elif day == 5: res = "Sat, " + res;
	elif day == 6: res = "Sun, " + res;

	res += temp[2];
	res += " 00:00:00 GMT";

	return res;

def estrai(url, links, news):
# Salva in due liste diverse le news e i link.
	try:
		homepage = urllib.urlretrieve(url);
	except:
		print "Errore nell'apertura della pagina.";
		raise SystemExit;

	with open(homepage[0], "r") as file:
		pagina = file.read();

	sezione = acconcia(pagina, url);

	for newslink in sezione:
		if is_valid_url(newslink) == True:
			temp = urllib.urlretrieve(newslink.strip());
			with open(temp[0], "r") as file:
			    links.append(newslink.strip());
			    news.append(strappa(file.read(), "<body>", "</body>"));

	return;

def genera_feed(feedlink, links, news, destfile):
	feed = "<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">

<channel>

<title>Notizie in evidenza dalla Facoltà di Lettere e Filosofia dell'Università di Palermo</title>

<link>";
	feed += feedlink;
	feed += "</link>

<description>Questo feed viene generato automaticamente da uno script a partire dalla pagina iniziale
del sito della Facoltà di Lettere e Filosofia dell'Università di Palermo</description>

<lastBuildDate>";
	feed += datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S");
	feed += " GMT</lastBuildDate>
<language>it-IT</language>
";
	for _news, _link in zip(news, links):
		item = "<item>
<title>";
		title = strappa(_news, "<!--", "<br><br>-->");
		item += title;
		item += "</title>
";
		item += "<link>";
	        item += _link;
		item += "</link>
<guid>";
	        item += _link;
		item += "</guid>
<pubDate>";
		date = strappa(_news, "<b><font color="">", "</font><br><br></b>");
		item += it_to_ctime(date);
		item += "</pubDate>
<description><![CDATA[[ ";
		body = strappa(_news, "<br><br>-->", "</div>");
		item += body;
		item += " ]]></description>
</item>
";
		feed += item;
	feed +=	"</channel>
</rss>";
	with open(destfile, "w") as file:
		file.write(feed);
	return;

def carica_file_ftp(host, netrc_pathname, username, account, password, remotedir, filename, keep_file):
	if username == "" and account == "" and password == "":
		try:
			netrc_parser = netrc.netrc(os.path.expanduser(netrc_pathname));
		except netrc.NetrcParseError:
			print "Errore durante la lettura del file netrc";
			raise SystemExit;
		auth_data = netrc_parser.authenticators(ftp_host);
		username = auth_data[0];
		account = auth_data[1];
		password = auth_data[2];

	try:
		ftp = FTP(host, username, password, account);
		ftp.set_pasv(True);
		ftp.cwd(remotedir);
		ftp.storbinary("STOR " + filename, open(filename, "rb"), 1024);
		ftp.close();
		if keep_file == False:
			os.remove(filename);
	except OSError:
		print "Impossibile rimuovere " + filename;
		raise SystemExit;
	except ftplib.error_reply:
		print "Risposta non valida ricevuta."
		raise SystemExit;
	except ftplib.error_perm:
		print "Errore di autenticazione."
		raise SystemExit;
	except ftplib.error_proto:
		print "Risposta ricevuta dal server non valida."
		raise SystemExit;

	return;

if __name__ == '__main__':
# ***************************************************************************************************
# Queste due strutture dati sono necessarie. Potete ridenominarle a patto di aggiornare i riferimenti
# fino alla fine del file.
# ***************************************************************************************************

	links = [];
	news = [];

# *******************************
# Pochi parametri da configurare.
# *******************************

	home_link = "http://lettere.unipa.it/";  # L'URL di base cui dovrà ricondursi il feed.
	feed_pathname = "news_lettere_unipa.xml"; # Nome del file XML in cui salvare i dati

	netrc_pathname = "~/.netrc" # In .netrc si è soliti salvare (in UN*X) i dati personali di un account ftp
	ftp_host = "ftp.massimo30.net"; # Host FTP cui connettersi
	ftp_dir = "/httpdocs/feeds";

# Se non volete usare .netrc per salvare i vostri dati personali, potete inserirli direttamente nello script
# Sinceramente non vi consiglio di farlo, ma se proprio volete...	

	ftp_username=""
	ftp_password=""
	ftp_account=""

# *****************************************************************************************************
# Non è necessario modificare nulla oltre questa linea se si desidera solo far funzionare il programma.
# *****************************************************************************************************

	estrai(home_link, links, news);
	genera_feed(home_link, links, news, feed_pathname);
	carica_file_ftp(ftp_host, netrc_pathname, ftp_username, ftp_account, ftp_password, ftp_dir, feed_pathname, False);

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

apr
07

Makagiga, quando rss, calendario, photo editor e notepad convivono in un programma

 

Makagiga è un’applicazione in Java che potrebbe sostituire diverse applicazioni presenti in tutti i desktop. Offre infatti di base notepad, to-do manager, calendario, lettore rss, image viewer, Internet search.

Recentemente rilasciata nella versione 3.8.3 e scaricabile da sourceforge, Makagiga è abbastanza semplice da usare e può essere arricchita con diversi plugin.

Il programma supporta import/export dei file, come gli opml per esempio (è pure dotato di un minibrowser per navigare su Internet), e permette il drag & drop delle immagini che si possono pure modificare (non troppo ovviamente) all”interno del programma. Insomma, si tratta di un’applicazione ottima per esempio da installare su una chiavetta usb.

Un software tuttofare

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

nov
29

Aleko vi invita su Wave

 

Il titolo è particolarmente significativo ed autoesplicativo:

Vi invito su Wave!

Lasciatemi un commento o magari aggregate il mio feed nel vostro reader, vi invierò (o provvederò a farvi recapitare) un invito per l’onda di Google.

Ricordatevi di lasciare il vostro account gmail e di tornare a commentare questo nuovo servizio google che intende portare una vera e propria rivoluzione!

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

ott
28

RssOwl, un reader rss veloce, flessibile e multipiattaforma

 

RssOwl, l'interfaccia

Avevamo parlato già di RssOwl in un articolo di qualche anno fa. Da allora, ne è passato di tempo e molte funzionalità nuove sono state inserite nell’ultima versione, la 2.0, rilasciata pochi giorni fa. Per chi non lo sapesse, RssOwl è un reader rss che consente di raccogliere e organizzare le informazioni provenienti da sorgenti rss attraverso una interfaccia molto semplice.

L’applicativo è stato realizzato utilizzando il framework Eclipse Rich Client Platform, e non a caso la sua interfaccia ricorda quella del noto ambiente di sviluppo per Java. Si appoggia a db4o per il salvataggio delle news. Inoltre, per fornire operazioni di ricerca efficienti, l’applicativo utilizza Lucene.

RssOwl può visualizzare le news in un browser embedded o in uno esterno all’applicativo. Gestisce inoltre le tab multiple ed è in grado di raggruppare le news in base a diversi fattori di raggruppamento, quali ad esempio, data e autore. RssOwl inoltre informa l’utente sull’arrivo di nuove news attraverso il Notifier, un piccolo popup che visualizza i titoli delle news. Il Notifier può essere configurato attraverso filtri, in modo da selezionare le news per le quali si vuole essere avvisati.

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

ott
27

Downdoad dei torrent da RSS con Transmission

 

Nel mio trumatico passaggio da KDE a Gnome, una delle cose a cui assolutamente non ho potuto rinunciare è il download automatico dei torrent pubblicati in un RSS.

Mi sono quidni presentato dal mio amico voRia con una delle mie solite folli richieste: uno script per scaricare i torrent da una fonte RSS con Transmission. Forse non tutti sanno che questo client torrent non permette il download automatico da RSS, tuttavia è possibile aprire automaticamente tutti i torrent presenti in una directory. La mia è stata quella di scaricare dentro la cartella i torrent che venivano pubblicati dall’RSS.

Lo script che voRa ha realizzato legge i torrent, controlla la data di pubblicazione e scarica solamente quelli più recenti. Come fonti RSS vengono utilizzati i link generati da Eztv.it.

Fra le variabili da impostare, oltre alla lista degli RSS, c’è anche la directory dove salvarli.

Un grazie sentito a voRia per l’infinita pazienza

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

ago
20

Liferea lento in Ubuntu 9.04? Ecco la soluzione

 

rssIn questi giorni ho abbandonato Evolution in seguito a svariati motivi di cui non voglio discutere in questo articolo ( anche perché molti sono puramente soggettivi ) per ritornare al vecchio e caro Thunderbird ( l’unico problema che ho dovuto risolvere era l’integrazione con il plugin del calendario Lightning, maledette libstdc++5!! ). Sistemata tutta la mia posta elettronica installo come lettore di news Liferea ( si anche Thunderbird legge le news ma ho sempre trovato Liferea molto più comodo e completo ), importo il file xml che avevo generato con Evolution e qui mi trovo di fronte ad un’amara visione. La finestra di Liferea diventa tutta grigia e sembra tutto bloccato.

Vabbè, dico, magari è solo un brutto bug post importazione quindi killo il processo e rilancio il lettore ma purtroppo non cambia niente. Dopo alcuni secondi dall’apertura la finestra diventa nuovamente grigia. A questo punto decido di aspettare e dopo pochi secondi compare la prima notifica che mi informa che il primo notiziario è aggiornato, dopo altri circa 20 secondi un’altra notifica mi da la conferma dell’aggiornamento del secondo notiziario e così via per tutti gli altri.

Considerato il fatto che ho circa una cinquantina di notiziari direi che a questa cosa bisogna assolutamente porre rimedio! Dopo diverse ricerche riesco a trovare qualcosa che si avvicina alla soluzione finché unendo 2 idee riesco a trovare la giusta via.

ATTENZIONE: la seguente soluzione sembra funzionare solo per la serie 1.4.* ( la versione che è attualmente nei repository di Ubuntu è la 1.4.26) ho provato anche scaricando la 1.5.* ma non funziona e Liferea rimane sempre lento.

Vediamo allora come si deve procedere. Installiamo il lettore con il comando

sudo apt-get install liferea

andiamo poi a creare il file libfsync.c in questo modo

cd /usr/src
sudo mkdir libfsync
cd libfsync
sudo gedit libfsync.c

verrà aperto in questo modo un file vuoto nel quale dovremo copiare queste righe

int fsync (int fd) {
return 0;
}

salviamo il tutto e chiudiamo l’editor. Ora da terminale diamo il seguente comando

sudo gcc -Wall libfsync.c -o libfsync.so -shared -fPIC -Wl,-soname,libfsync.so

per verificare che tutto si sia svolto correttamente digitiamo il comando ls e dovremo trovare oltre al file libfsync.c creato precedentemente, il file libfsync.so

Ora modifichiamo il lanciatore di Liferea in questo modo

sudo gedit /usr/bin/liferea

e nella seconda riga (dopo #!/bin/sh) copiamo il codice seguente

export LD_PRELOAD=/usr/src/libfsync/libfsync.so

A questo punto possiamo lanciare Liferea e non riscontrare più nessun rallentamento :)

No related posts.

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

ago
14

Installare Miro su Ubuntu

 
Miro per Ubuntu

Miro per Ubuntu

Miro è un player video ( ma anche audio :) ) davvero semplice e completo. Tra le caratteristiche principale vi è la capacità di accedere ai filmati tramite Feed RSS e Podcast, oppure condividere i video dai principali portali di video sharing come Youtube e Google Video. Miro è anche integrato con il client BitTorrent e presenta una veste grafica davvero accattivante e coinvolgente.

Per installarlo su ubuntu, basteranno pochi e semplici passi. Aprite il terminale e digitate:

sudo gedit /etc/apt/sources.list

e a seconda della versione di ubuntu che avete aggiungete i seguenti repository

Ubuntu Jaunty (9.04)

#Miro
deb http://ftp.osuosl.org/pub/pculture.org/miro/linux/repositories/ubuntu jaunty/

Ubuntu Intrepid (8.10)

#Miro
deb http://ftp.osuosl.org/pub/pculture.org/miro/linux/repositories/ubuntu intrepid/

Ubuntu Hardy (8.04)

#Miro
deb http://ftp.osuosl.org/pub/pculture.org/miro/linux/repositories/ubuntu hardy/

Ora chiudiamo l’editor salvando le modifiche e aggiorniamo il sistema con il classico

sudo apt-get update

e installiamo Miro

sudo apt-get install miro

E’ tutto :) Troverete Miro in Applicazioni -> Audio e Video.Naturalmente  Se in futuro vi siete stancati di Miro o non vi soddisfa basterà disinstallarlo con un semplice

sudo apt-get remove --purge miro

Alla prossima :)

Vuoi aumentare la velocità dei tuoi download,dello streaming e migliorare la qualità del video?? Scarica Speed Downloading, un programma gratuito di cui non ti pentirai.

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

mag
07

FatRat, un ottimo download manager per scaricare: torrent, file da Rapidshare, video da YouTube, e tanto altro

 

screenshot 0011 FatRat, un ottimo download manager per scaricare: torrent, file da Rapidshare, video da YouTube, e tanto altro

Oggi voglio parlarvi di FatRat, un download manager che mette a disposizione degli un buon numero di funzioni. È un applicazione semisconosciuta ma penso che meriti un po’ più di attenzione. FatRat infatti, oltre per i normali download (http e ftp), può essere usato sia come bittorrent client, che per l’upload ed il download di files da Rapidshare.com (anche come premium). Ma non è tutto, con FatRat, si possono scaricare video da YouTube, cercare e caricare torrent sui principali tracker (Demonoid, BtJunkie, Mininova, ecc), controllare l’hash dei file e scaricare feed e podcast.

fatrat4 FatRat, un ottimo download manager per scaricare: torrent, file da Rapidshare, video da YouTube, e tanto altro

L’interfaccia grafica è molto curata e permette di compiere comodamente i più svariati compiti, suddivisi per schede. FatRat è anche molto configurabile, sia per quanto riguarda il download dei file .torent, che per le altre opzioni, ed è dotato di una struttura a plugin, che permette di estenderne le funzionalità. Questo è il sito ufficiale del progetto, dal quale si possono scaricare i sorgenti.

fatrat5 300x221 FatRat, un ottimo download manager per scaricare: torrent, file da Rapidshare, video da YouTube, e tanto altro

Stranamente, esistono i pacchetti precompilati per OpenSuse, Gentoo ed Arch, ma non per Debian/Ubuntu. Chi quindi utilizza Ubuntu se lo deve compilare, ed è forse per questo che FatRat non è molto conosciuto. Oggi ci ho provato, e dopo alcuni problemi con l’archivio dei sorgenti, ce l’ho fatta, scaricandolo dal git repository. Ecco come.

Installazione in Ubuntu 9.04

Innanzitutto bisogna scaricarlo con:

git clone git://git.dolezel.info/fatrat.git

cd fatrat

git branch –track 1.1 origin/1.1

git checkout 1.1

poi si devono installare alcune dipendenze con:

sudo apt-get install qt4-dev-tools cmake

sudo apt-get install libssh-2 libqt4-core libtorrent11 build-essential

sudo apt-get install libtorrent-rasterbar-dev libgloox-dev

sudo apt-get install libcurl4-openssl-dev

ed infine lo si compila e installa con:

cmake . -DWITH_BITTORRENT=ON -DWITH_SFTP=ON -DWITH_CURL=ON

make

sudo make install

Una volta terminata l’installazione, lo trovate nel menù “Applicazioni”, nella sezione “Internet”.

Articoli correlati:

Vuze, l’erede di Azureus. Ecco una panoramica sulle principali novità e come installarlo sotto Linux

Rilasciato LimeWire 5 alpha: condividere i nostri file con gli amici e i contatti Gmail

Apt-p2p, fare l’upgrade da Hardy a Intrepid tramite BitTorrent

Importare le blocklist di PeerGuardian in Deluge e KTorrent

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

apr
27

[RDF] soggetto, predicato, oggetto

 

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

mar
09

Aggregatori e rispetto delle licenze

 

Tutto quello che pubblico su questo blog è distribuito secondo una licenza Creative Commons piuttosto permissiva: ci vuole veramente poco a indicare la fonte originale (che è il link al singolo post e non uno generico al blog). Ho anche creato un feed apposito per gli aggregatori di articoli sul software libero, per evitare loro la fatica di selezionare i post, ma per qualcuno, evidentemente, non è abbastanza.

Ci sono aggregatori che usano come fonte altri aggregatori: il risultato di tutta questa aggregazione è che un mio post finisce su un sito di cui non so nulla (e fin qui mi sta anche bene), in cui non sono specificate nè la fonte nè la licenza (e questo mi sta molto meno bene).

Attualmente, i post del feed dedicato vanno a finire (che io sappia) su quattro aggregatori che dichiarano chiaramente la fonte (non fanno lo stesso con la licenza, e questo è male). Vediamo un esempio:

Sarebbe bene che per ogni fonte venisse indicata anche la licenza con cui i contenuti sono distribuiti, ma tutto sommato non ho granchè dii cui lamentarmi, visto anche che l’iscrizione a questi aggregatori è stata volontaria. Da qualche giorno, però, sono in contatto con il gestore di un altro aggregatore (non sarà l’unico, ma oggi parlo di lui) che si comporta in modo leggermente diverso: non ho trovato nessuna citazione, oltre che alla licenza, al mio post e questo mi fa girare alquanto le palle:

Al contrario, a fondo pagina, compare un bel messaggio di copyright.

Secondo il gestore dell’aggregatore dovrei vedermela con quelli di Tuxfeed.it perchè non mettono nel feed RSS l’indicazione del post originale, ma la cosa non mi trova d’accordo: non trovi il link originale nel feed RSS che usi per il tuo aggregatore? Metti almeno quello indicato nel feed (in questo caso a Tuxfeed.it): EvilSocket, invece, non mette proprio niente di niente, aggiungendo un bel copyright in fondo.

Gli ho chiesto già un paio di volte di decidere se indicare chiaramente le fonti in ogni articolo o, in alternativa, eliminare i miei post dal suo aggregatore. Lui dice che non può nè vuole farlo (probabilmente non lo farà e io non ho nè tempo nè voglia di andare per le lunghe con storie come queste), ma direi che il problema è solo suo, o sbaglio? Oltretutto, il tono arrogante dell’ultima mail non mi è piaciuto per niente (neanche li avesse scritti lui i post…), chissà se avrebbe fatto lo stesso con Corriere/Repubblica, eh? :D

Fatto sta che la cosa mi dà un sacco di fastidio. Ah, questo post andrà a finire anche in EvilSocket: anche se non troverete nessuna indicazione al riguardo, sappiate che non è farina del suo sacco. :)

Ti è piaciuto l articolo, eh? OFFRIMI UNA BIRRA! (è sufficiente essere iscritti a Paypal o avere una carta di credito, anche Postepay)

Condividi :

Facebook
TwitThis
Tumblr
FriendFeed
OKNotizie
Fai.Info
Diggita
ZicZac
Upnews
NotizieFlash
Pligg
PubblicaNews
Wikio IT
del.icio.us
StumbleUpon
Technorati
Netvibes


Guadagnare con il tuo blog? Prova Linklift, Teliad e Heyos. Poi fammi sapere!

Popularity: 1% [?]



Puoi visualizzare il post originale qui.

top