domenica 31 maggio 2009

rsync di cartelle windows su linux

Ho avuto bisogno di fare delle copie sincronizzate e periodiche di un server nt su un server linux (red hat) ed ho messo in crontab questo script:


#!/bin/sh

if df | grep -q -w /mnt/nt

then

echo "nt C$ gia' montato"

else

mount -t smbfs -o username=nt\\administrator,password=password,ro //nt/c\$ /mnt/nt &> /dev/null

echo "nt C$ montato ora"

fi

#ricontrolliamo prima di iniziare rsync

if df | grep -q -w /mnt/nt

then

echo "inizio backup "

rsync -avz --delete /mnt/nt/Program\ Files/IBM/* /home/nt/IBM/

echo "smonto le condivisioni...."

umount /mnt/nt

echo "terminato"

else

echo "errore nel montare nt C$"

fi

umount /mntnt

Particolarmente interessante è:

if df | grep -q -w (punto di mount)

che restituisce true o false a seconda che la condivisione sia montata o meno....

venerdì 22 maggio 2009

Un pulsante vale più di mille spiegazioni

Mi sono trovato più volte nella situazione di spiegare come esportare i contatti presenti nella rubrica di lotus notes in excel. Stanco di ripeterle ho googlato un po' ed ho creato un file di excel con bel un pulsante "Importa i contatti".
Nella prima riga ho inserito le intestazioni di colonna:

Title, LastName, FirstName, MiddleInitial, MailAddress, AltFullName, AltFullNameLanguage, PhoneNumber, CellPhoneNumber, HomeFAXPhoneNumber, HomeAddress, StreetAddress, City, JobTitle, OfficePhoneNumber, OfficeFAXPhoneNumber, CompanyName, OfficeStreetAddress , OfficeCity , OfficeState , OfficeZIP, State, AreaCodeFromLoc, Suffix, PhoneNumber_6, WebSite, BusinessAddress, Zip, OfficeCountry, country, Location, Spouse, Department, Children, Manager, Assistant, Birthday, FullName, Categories. 


Ho creato poi una routine in vba come segue:

Sub Importa_Rubrica_Notes()


Dim DomDir As NotesDatabase

Dim DomContacts As NotesView

Dim DomDoc As NotesDocument

Dim StrName As String

Dim myRange As Range

Dim DomSession As NotesSession

Dim StrTestDomSession As String

Set DomSession = CreateObject("Lotus.NotesSession")

DomSession.Initialize

Set DomDir = DomSession.GetDatabase("", "names.nsf")

Set DomContacts = DomDir.GetView("Contatti")

Set DomDoc = DomContacts.GetFirstDocument

Dim tot As Integer

tot = 2


While Not (DomDoc Is Nothing)

Cells(tot, 1).Value = DomDoc.GetItemValue("Title")(0)

Cells(tot, 2).Value = DomDoc.GetItemValue("LastName")(0)

Cells(tot, 3).Value = DomDoc.GetItemValue("FirstName")(0)

Cells(tot, 4).Value = DomDoc.GetItemValue("MiddleInitial")(0)

Cells(tot, 5).Value = DomDoc.GetItemValue("MailAddress")(0)

Cells(tot, 6).Value = DomDoc.GetItemValue("AltFullName")(0)

Cells(tot, 7).Value = DomDoc.GetItemValue("AltFullNameLanguage")(0)

Cells(tot, 8).Value = DomDoc.GetItemValue("PhoneNumber")(0)

Cells(tot, 9).Value = DomDoc.GetItemValue("CellPhoneNumber")(0)

Cells(tot, 10).Value = DomDoc.GetItemValue("HomeFAXPhoneNumber")(0)

Cells(tot, 11).Value = DomDoc.GetItemValue("HomeAddress")(0)

Cells(tot, 12).Value = DomDoc.GetItemValue("StreetAddress")(0)

Cells(tot, 13).Value = DomDoc.GetItemValue("City")(0)

Cells(tot, 14).Value = DomDoc.GetItemValue("JobTitle")(0)

Cells(tot, 15).Value = DomDoc.GetItemValue("OfficePhoneNumber")(0)

Cells(tot, 16).Value = DomDoc.GetItemValue("OfficeFAXPhoneNumber")(0)

Cells(tot, 17).Value = DomDoc.GetItemValue("CompanyName")(0)

Cells(tot, 18).Value = DomDoc.GetItemValue("OfficeStreetAddress ")(0)

Cells(tot, 19).Value = DomDoc.GetItemValue("OfficeCity ")(0)

Cells(tot, 20).Value = DomDoc.GetItemValue("OfficeState ")(0)

Cells(tot, 21).Value = DomDoc.GetItemValue("OfficeZIP")(0)

Cells(tot, 22).Value = DomDoc.GetItemValue("State")(0)

Cells(tot, 23).Value = DomDoc.GetItemValue("AreaCodeFromLoc")(0)

Cells(tot, 24).Value = DomDoc.GetItemValue("Suffix")(0)

Cells(tot, 25).Value = DomDoc.GetItemValue("PhoneNumber_6")(0)

Cells(tot, 26).Value = DomDoc.GetItemValue("WebSite")(0)

Cells(tot, 27).Value = DomDoc.GetItemValue("BusinessAddress")(0)

Cells(tot, 28).Value = DomDoc.GetItemValue("Zip")(0)

Cells(tot, 29).Value = DomDoc.GetItemValue("OfficeCountry")(0)

Cells(tot, 30).Value = DomDoc.GetItemValue("country")(0)

Cells(tot, 31).Value = DomDoc.GetItemValue("Location")(0)

Cells(tot, 32).Value = DomDoc.GetItemValue("Spouse")(0)

Cells(tot, 33).Value = DomDoc.GetItemValue("Department")(0)

Cells(tot, 34).Value = DomDoc.GetItemValue("Children")(0)

Cells(tot, 35).Value = DomDoc.GetItemValue("Manager")(0)

Cells(tot, 36).Value = DomDoc.GetItemValue("Assistant")(0)

Cells(tot, 37).Value = DomDoc.GetItemValue("Birthday")(0)

Cells(tot, 38).Value = DomDoc.GetItemValue("FullName")(0)

Cells(tot, 39).Value = DomDoc.GetItemValue("Categories")(0)


Set DomDoc = DomContacts.GetNextDocument(DomDoc)

tot = tot + 1

Wend


End Sub


Ho collegato la funzione al pulsante, salvato e voilà:
adesso mi basta inviare il file a chi me lo chiede....

OpenPMA e altoparlante interno


Dopo l'installazione di openPMA nel mio Archos PMA400 mi ero trovato con l'altoparlante interno disattivato. Non l'ho mai utilizzato, ma desideravo comunque fosse attivo.
Il bug era conosciuto e la soluzione è presente sul sito pointlisse.com nella sezione troubleshooting:
dopo l'aggiornamento del firmware il mixer di default è il microfono interno. Basta aprire l'applicazione Registrazione audio e cambiare la fonte di input in una qualsiasi.
La possibilità di utilizzare l'altoparlante interno ora è abilitata.

giovedì 21 maggio 2009

Vernice online

In questa foto, scattata qualche tempo fa sul lungo lago di Arona, c'è un errore......



Installazione openPMA


Da qualche anno sono un felice possessore di un Archos PMA400, un Personal Digital Assitant - Portable Media Player linux based (Linux Qtopia), hard disk 30 GB, wifi e tante altre belle cosette (un antesignano dell'iPod Touch, insomma). Ora è fuori produzione. Essendo basato su linux, naturalmente è stata creata una versione "community" che implementa e migliora il s.o. presente sul dispositivo. Ho deciso di sostituire il s.o. fornito dalla Archos con openPMA.
La procedura è stata abbastanza semplice ed indolore:
basta seguire le istruzioni contenute nell'official openPMA installation guide per installare ed integrare con le applicazioni già presenti openPMA.
Per prima è necessario scaricare ed installare il bootloader alternativo qui.
Avvenuta l'installazione del package nel PMA400 del boothack si lancia l'applicazione dal tab Impostazioni e si preme OK (è possibile anche fare il restore del bootloader ufficiale successivamente).
Si scarica e scompatta su un computer l'ultima versione di openPMA (giraffe).
Si spegne il palmare, lo si collega spento al computer tramite il cavo usb e finalmente lo si accende.
Si può procedere ora in due direzioni.
la prima, avendo sufficientemente spazio libero (6 GB):


  1. si esegue il chkdsk del disco

  2. lo si deframmenta

  3. ci si reca nella cartella System

  4. si rinomina aimage.img (il s.o.) ad esempio in aimage.archos

  5. si copiano i files aimage.img e openpma.img scaricati da opempma.org in questa cartella.
La seconda invece consiste:


  1. backup completo dei dati presenti sul palmare

  2. formattazione in fat32 del palmare

  3. si scompatta e si copia nel palmare formattato il PMA400 recovery già presente nell'archos ma comunque scaricabile dal sito di Archos

  4. ci si reca nella cartella System

  5. si rinomina aimage.img (il s.o.) ad esempio in aimage.archos

  6. si copiano i files aimage.img e openpma.img scaricati da opempma.org in questa cartella.

  7. se si vuole mantenere eventuali programmi installati precedentemente sul palmare copiare in questa cartella il file progfs.img dal backup effettuato.

Solo a questo punto si deve:


  1. smontare correttamente il PMA400 dal computer e senza staccare il cavo con una graffetta effettuare lo spegnimento del palmare agendo nell'apposito buco alla base (reset pin hole).

  2. a palmare spento scollegare il cavo usb e procedere all'accensione.
Il nuovo sistema operativo procederà quindi al processo di installazione consistente nella creazione di una partizione nascosta di 512 Mb ed al merge dei due files progfs.img e di openpma.img, contenenti le applicazioni.
Se tutto va a buon fine avremo il nostro nuovo sistema operativo funzionante.
Purtroppo, nonostante avessi 12 GB liberi, ho dovuto optare per la seconda scelta in quanto avevo sempre un errore durante la creazione della partizione nascosta. E' stato un procedimento più lungo, ma che mi ha anche consentito di fare un po' di pulizia.

Impressioni: il sistema mi sembra migliore e più stabile di quello fornito di fabbrica, ho a disposizione tramite terminale molte più funzioni e programmi, e se per qualche motivo volessi tornare indietro potrei farlo seguendo le istruzioni a ritroso della prima direzione, rinominando aimage.img in aimage.openpma e aimage.archos in aimage.img, verificando la presenza del file progfs.img (il file immagine contente le applicazioni installate di default da Archos), resettando e accendendo il palmare. Se volessi invece eliminare anche la partizione nascosta dovrei a questo punto tramite un pc eliminarla, formattare l'unità in fat32, copiare il PAM recovery, resettare e accendere il palmare.
L'unico difetto per ora ho riscontrato è stato la disattivazione dell'altoparlante interno, ma onestamente non ho ancora verificato se ci sono dei work-around.
Devo anche verificare se funziona il collegamento al televisore, la registrazione audio - video ed il telecomando.

lunedì 18 maggio 2009

Creare un plugin per XBMC parte 2


Scriviamo ora il plugin di XBMC per vedere le dirette web del sito rai.tv.

Abbiamo bisogno di:

i link degli streaming,

le icone della Rai e dei canali trasmessi,

le regex per l'estrazione degli url dai files asx.

I link degli streaming li abbiamo, le icone dei canali trasmessi le recuperiamo dal file xml scaricato (è il valore di <imageUnit name="nome canale - logo videowall" type="RaiTv RollOver Image"><image>/dl/images/nome icona.png</image>), mentre l'immagine della Rai la recuperiamo dal sorgente del sito (http://www.rai.tv/dl/RaiTV/images/logo_raitv.png).

Procediamo scaricando l'immagine della Rai nella directory del plugin rinominandola in default.tbn.

Editiamo il file default.py

nella routine CATEGORIES() inseriamo:

addDir('Rai1','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983',2,'http://www.rai.it/dl/images/1233832365974RaiUno_02.png')

addDir('Rai2','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=984',2,'http://www.rai.it/dl/images/1233832404832RaiDue02.png')

addDir('Rai3','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=986',2,'http://www.rai.it/dl/images/1233832447578RaiTre_02.png')

addDir('RaiNews24','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=1',2,'http://www.rai.it/dl/images/1233841893415RaiNews24_02.png')

addDir('RaiSport+','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=4145',2,'http://www.rai.it/dl/images/1233856927849raisport_.png')

addDir('RaiStoria','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24269',2,'http://www.rai.it/dl/images/1233857018728raistoria.png')

addDir('RaiEdu','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24268',2,'http://www.rai.it/dl/images/1233837355373RaiEdu1_02.png')

ovvero aggiungi un menu directory, con il nome Rai1, imposta il link http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983, imposta il mode 2, utilizza la funzione VIDEOLINKS() per l'elaborazione della regex e la creazione del menu con il link allo streaming, utilizza questa immagine come logo.

Nella routine VIDEOLINKS(url,name) inseriamo:

req = urllib2.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')

response = urllib2.urlopen(req)

link=response.read()

response.close()

match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link)

for url in match:

addLink(name,url,'')

ovvero apri una connessione all'url specificato, modifica lo User-Agent con quello di Mozilla di Ubuntu, calcola la regex, e crea il menu con l'url ricavato e il nome passato alla funzione.

Il nostro plugin è pronto e funzionante.

Lanciamo XBMC nella sezione Video scegliamo Plugin Video e successivamente Rai.tv e godiamoci la diretta!

Per completezza ecco il sorgente completo (trattandosi di python bisogna fare attenzione all'indentazione):

import urllib,urllib2,re,xbmcplugin,xbmcgui


__scriptname__ = "XBMC Video Plugin"

__author__ = 'fabrintosh [http://fabrintosh.blogspot.com]'

__date__ = '18-05-2009'

__version__ = "r001"


def CATEGORIES():

addDir('Rai1','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983',2,'http://www.rai.it/dl/images/1233832365974RaiUno_02.png')

addDir('Rai2','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=984',2,'http://www.rai.it/dl/images/1233832404832RaiDue02.png')

addDir('Rai3','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=986',2,'http://www.rai.it/dl/images/1233832447578RaiTre_02.png')

addDir('RaiNews24','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=1',2,'http://www.rai.it/dl/images/1233841893415RaiNews24_02.png')

addDir('RaiSport+','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=4145',2,'http://www.rai.it/dl/images/1233856927849raisport_.png')

addDir('RaiStoria','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24269',2,'http://www.rai.it/dl/images/1233857018728raistoria.png')

addDir('RaiEdu','http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=24268',2,'http://www.rai.it/dl/images/1233837355373RaiEdu1_02.png')

def INDEX(url):

req = urllib2.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')

response = urllib2.urlopen(req)

link=response.read()

response.close()

match=re.compile('').findall(link)

for thumbnail,url,name in match:

addDir(name,url,2,thumbnail)


def VIDEOLINKS(url,name):

req = urllib2.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')

response = urllib2.urlopen(req)

link=response.read()

response.close()

match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link)

for url in match:

addLink(name,url,'')


def get_params():

param=[]

paramstring=sys.argv[2]

if len(paramstring)>=2:

params=sys.argv[2]

cleanedparams=params.replace('?','')

if (params[len(params)-1]=='/'):

params=params[0:len(params)-2]

pairsofparams=cleanedparams.split('&')

param={}

for i in range(len(pairsofparams)):

splitparams={}

splitparams=pairsofparams[i].split('=')

if (len(splitparams))==2:

param[splitparams[0]]=splitparams[1]

return param





def addLink(name,url,iconimage):

ok=True

liz=xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=iconimage)

liz.setInfo( type="Video", infoLabels={ "Title": name } )

ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=url,listitem=liz)

return ok



def addDir(name,url,mode,iconimage):

u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)

ok=True

liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage)

liz.setInfo( type="Video", infoLabels={ "Title": name } )

ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)

return ok



params=get_params()

url=None

name=None

mode=None


try:

url=urllib.unquote_plus(params["url"])

except:

pass

try:

name=urllib.unquote_plus(params["name"])

except:

pass

try:

mode=int(params["mode"])

except:

pass


print "Mode: "+str(mode)

print "URL: "+str(url)

print "Name: "+str(name)


if mode==None or url==None or len(url)<1:

print ""

CATEGORIES()

elif mode==1:

print ""+url

INDEX(url)


elif mode==2:

print ""+url

VIDEOLINKS(url,name)


xbmcplugin.endOfDirectory(int(sys.argv[1]))


domenica 17 maggio 2009

Creare un plugin per XBMC parte 1


Creare un plugin per XBMC come avevo spiegato (male) è semplice. Scendiamo nel pratico:

voglio  vedere la diretta web dei canali rai con XBMC.

Dopo avere scaricato il tutorial dal sito di XBMC lo scompattiamo e creiamo una cartella dal nome Rai.tv in:

~/.xbmc/plugins/video/ (Linux)

~/Library/Application Support/XBMC/plugins/video/ (Mac)

c:\Program Files\XBMC\plugins\video\ (Windows).

copiamo il file default.py ed il file test.py presenti nel tutorial nella cartella che abbiamo creato. 

Come già indicato in numerosi post come ad esempio qui recuperiamo la lista dei link che ci occorrono.

Se non vogliamo correre rischi ed utilizzare la lista più recente, si può, spulciando il sorgente della pagina www.rai.tv, cercare la variabile channelXmlPath che ci fornirà il link del file xml che contiene gli indirizzi delle dirette (sottochiave <url> di <videoUnit name="nome del canale - full" type="RaiTv Diretta Full Video">).

Per verificare il collegamento apriamo con un editor il file test.py. 

Alla variabile url assegnamo  un link (ad esempio Rai1) http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983 e aggiungiamo dopo la riga response.close() la riga print link affinchè test.py sia così:


import urllib2,urllib,re


url='http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983'


req = urllib2.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')

response = urllib2.urlopen(req)

link=response.read()

response.close()

print link

match=re.compile('Regular expression here').findall(link)

print match


Salviamo, apriamo il terminale (o il prompt dei comandi) ci rechiamo nella directory del plugin (cd ~/Library/Application Support/XBMC/plugins/video/Rai.tv)

digitiamo python test.py e vediamo cosa stampa su schermo la nostra print:

<ASX VERSION="3.0">     <ENTRY>        <REF HREF="http://www.banneradmin.rai.it/ads/siparietti/buona_visioneMed_Progautopromo.wmv" />     </ENTRY>  </ASX>

Se proviamo ad aprire con vlc il link ottenuto (http://www.banneradmin.rai.it/ads/siparietti/buona_visioneMed_Progautopromo.wmv) vedremo solo un banner di buona visione e  null'altro. Questo perchè dobbiamo anche modificare lo User Agent inviato al sito della rai utilizzando quello di Mozilla di una qualsiasi distribuzione linux:

req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')

Otterremo questa risposta:

<ASX VERSION="3.0">  <ENTRY><REF HREF="mms://livestream.rai.it.edgestreams.net/reflector:64084?auth=daEcyc4agdPaTcNbSaGbAdPcKb6d4aldjdV-bkecTK-b4-ElxuxHo&aifp=V001" />  </ENTRY>  </ASX>

Abbiamo ottenuto un link mms!

Per estrarre il link mms della diretta da comunicare al plugin di XBMC dobbiamo utilizzare una regex, ma prima solitamente elimino spazi, tabulatori, ritorni a capo superflui per potermi concentrare sulla espressione più agevolmente. Quindi procediamo a sostituire la riga link=response.read() con:

link = ''

for line in response.read().split( '\n' ):

    link += line.lstrip().rstrip()

link = link.replace( '\r', '' ).replace( '\t', '' ).replace( '\n', '' )

Otterremo così:

<ASX VERSION="3.0"><ENTRY><REF HREF="mms://livestream.rai.it.edgestreams.net/reflector:64084?auth=daEcfd4cgdEatbAblddaQbEb8azdhdqaVae-bkec_a-b4-FmxwxHn&aifp=V001" /></ENTRY></ASX> che è molto più leggibile.

L'espressione che fa al caso nostro è <ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX> e la inseriamo nella funzione re.compile('expr').findall(link)

match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link) e estraiamo il link trovato.

if match:

for url in match:

print url + '\r'

eliminiamo le righe print link e print match. test.py dovrebbe ora avere la seguente fisionomia:


#!/usr/bin/python


import urllib2,urllib,re


url='http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=983'


req = urllib2.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.10 (intrepid) Firefox/3.0.6')

response = urllib2.urlopen(req)

link = ''

for line in response.read().split( '\n' ):

    link += line.lstrip().rstrip()

link = link.replace( '\r', '' ).replace( '\t', '' ).replace( '\n', '' )

response.close()

match=re.compile('<ASX VERSION="3.0"><ENTRY><REF HREF="(.+?)" /></ENTRY></ASX>').findall(link)

if match:

for url in match:

print url + '\r'

(in grassetto le parti modificate del file test.py originale).

python test.py  stamperà sullo schermo mms://livestream.rai.it.edgestreams.net/reflector:64084?auth=daEcfd4cgdEatbAblddaQbEb8azdhdqaVae-bkec_a-b4-FmxwxHn&aifp=V001 che possiamo provare ad aprire con vlc per verificare il collegamento.

Ora che abbiamo link e regex possiamo passare alla sviluppo del plugin vero e proprio.....

XBMC ed i plugins


A casa ho due vecchi computer  che svolgono la funzione di HTPC. 

Hanno  installato Freevo che è a mio parere il migliore software HTPC open source esistente.

Freevo è scritto in python, utilizza massivamente mplayer (anche se supporta vlc e xine), gira principalmente su Linux  e  non ha particolari richieste hardware, consentendo quindi di avere un ottimo sistema di home theatre a costi contenuti.

Nel mio caso utilizzo un PIII ed un PIV.

E'  estensibile grazie a  numerosi plugins. Ne ho scritto qualcuno anch'io e uno di questi è nella distribuzione ufficiale, per la precisione quello di wwitv.  

Installare freevo sul mio MacBook con Mac OS X è una operazione fattibile anche se non semplicissima, e per ora non ho abbastanza tempo libero per farlo.

Ho provato quindi XBMC, finalmente in versione Intel e PPC, bello pronto da installare con il suo file dmg.

Le richieste hardware sono decisamente più elevate, rendendolo inutilizzabile sui due  htpc che ho in casa, ma la grafica è decisamente carina, si interfaccia agevolmente con i server UPnP (il sistema che utilizzo per condividere musica, film foto e quant'altro) e fa lui stesso da server UPnP.

E' estensibile tramite plugins, e indovinate un po' in che linguaggio? Python!

Ho provato subito a scriverne uno di prova, e sono rimasto piacevolmente colpito dalla presenza di:

un soddisfacente tutorial, una maggiore documentazione, uno scheletro di plugin con cui partire, poche routines chiare ed accessibili.

Creare un plugin video in XBMC può addirittura consistere nel trovare la giusta regex in una pagina web ed passare i risultati a  

addDir(name,url,mode,thumbnail)o addLink(name,url,tumbnail)

Quindi come spiegato nell'ottimo tutorial, inserendo in CATEGORIES() 

addDir("MOVIES","http://www.tvdash.com/movies.html",1," http://reggiebibbs.files.wordpress.com/2007/12/the-movies360-crop.jpg") 

avremo un menu di tipo cartella "Movies" il cui clic  invocherà la routine INDEX() passando come argomento l'url http://www.tvdash.com/movies.html.

Compito della funzione INDEX sarà quello di scaricare la pagina web ed applicare la regex desiderata per poi passare a addLink(name,url) i links dei video trovati, creando dei sotto menu "links" che avranno il compito di lanciare il player collegandosi all'url del video specificato.

Decisamente veloce e semplice.

sabato 16 maggio 2009

The Big Bang Theory 2

Ho visto una decina di episodi di  "The Big Bang Theory" e devo dire che lo trovo veramente carino.
Nulla a che vedere con IT Crowd, i miei miti, questi sono fisici con i cosiddetti e non hanno nulla in comune con me.
I dialoghi sono più difficili rispetto a IT Crowd e senza l'aiuto di ITASA (Italian Subs Addicted) avrei capito ben poco.
Grazie ITASA!

CAMPIONI!

Vabbè dai, l'Inter è campione d'Italia, senza neanche l'emozione di giocarsela....
Come direbbe il presidente: "simpatica squadra l'Udinese"  ;-)

sabato 2 maggio 2009

The Big Bang Theory

Sono un fan sfegatato di IT Crowduna fantastica sitcom britannica trasmessa da Channel 4, con protagonisti due "standard nerds" del reparto IT ed il loro capo (una donna a digiuno di informatica) di una grossa società inglese.
La serie non è ancora trasmessa in Italia, e vista la qualità delle sitcom trasmesse nel nostro paese non mi sorprendo neanche un po' a non trovarla da noi.
Senza ricorrere a qualche torrent si possono gustare spezzoni delle puntate presso il loro sito ufficiale, su youtube o anche su siti di fans  dove addirittura troviamo le puntate intere.
Sembra che la serie sia una risposta inglese alla serie americana The Big Bang Theory (il sito ufficiale è questo) dove i protagonisti sono invece due fisici ed una bella ragazza. 
Potevo forse farmela scappare? 
Sto quindi iniziando a gustarmi The Big Bang Theory (in originale, naturalmente)... Questa serie è stata trasmessa in Italia, ma Antonio Genna, sicuramente più esperto di me nel campo delle traduzioni, sostiene ne abbiano stravolto le voci, i caratteri ed i dialoghi, ed io ci credo. 
Vedremo se è allo stesso livello di IT Crowd.
Stay tuned

Il campi dell'Abruzzo

Continuo a non capire (o forse invece capisco) la quasi totale omogeneità delle notizie che ci giungono dall'Abruzzo, non una voce fuori dal coro, grande soddisfazione per l'efficacia ed efficienza  nella gestione da parte del governo e protezione civile del dramma.
Insomma, passato il dolore, sembra diventata una vacanza in campeggio o per i più fortunati al mare in albergo a spese del governo.
E' importante diffondere il più possibile le testimonianze che ci giungono direttamente dall'Abruzzo per rendersi conto della reale situazione e poter offrire un aiuto mirato a chi ne ha bisogno.
Testimonianze della vita quotidiana e dei bisogni si possono trovare da Miss Kappa e terremoto09.