martedì 30 giugno 2009

Atlantide Media Center: menù di partenza

Un po' di brainstorming per il media center:
  • ogni menù ha una voce 'setup' che permette di configurare gli aspetti di quel menù, come ad esempio il percorso dove trovare i file multimediali, o il comando da impostare per riprodurli
  • ogni menù ha una voce 'indietro' ('esci' su quello principale)
  • dati possono essere directory e file, che si possono rinominare, cancellare, copiare, spostare; si possono creare directory nuove
  • se evidenziata una cartella, ti dice il numero di file e la data del più recente
  • se evidenziato un file ti dice dimensione, data e lunghezza (e magari copertina e info IMDB o equivalente italiano!)
  • nel menù 'Guarda TV' la funzione 'Setup' attiva la funzione di popolamento dei canali, e il comando per la visualizzazione dei canali stessi
  • i programmi registrati vanno in 'Registra TV', si possono poi spostare a piacere; in quel menù sono presenti le programmazioni
E ora un po' di codice python...

#!/usr/bin/python
########################################################
# Note sul nome delle variabili e funzioni :
# iniziano tutte con una sequenza che indica il tipo
#
# i = intero
# s = surface
# str = stringa
# font = font
# r = rect
########################################################
# Imports
########################################################
import pygame, sys, os
from pygame.locals import *
########################################################
# Inizializzazione variabili
########################################################
pygame.init()
iiResolution = (800, 600)
fontDefault = pygame.font.Font(None, 36)
# set screen resolution
pygame.display.set_mode(iiResolution, 0, 32)
sScreen = pygame.display.get_surface()
strBackgroundFile = os.path.join(".","Atlantis_by_aksu.jpg")
sBackground = pygame.image.load(strBackgroundFile)
strCurrentMenu = os.path.join(".","main.mnu")
########################################################
# Functions
########################################################
def drawMenu(menuFile, iSelected):
# Disegna il contenuto del menuFile ed evidenzia il selected
global sForeground, fontDefault
##################################
file = open(menuFile, 'r')
i=0
centerx = sForeground.get_rect().centerx
offsy = sForeground.get_rect().centery/2
for line in file:
line = line.replace ( "\n", "" )
sText = fontDefault.render(line, 1, (255, 255, 255))
rText = sText.get_rect()
rText.centerx = centerx
rText.y = i*32+offsy
if i == iSelected:
rText2 = rText.inflate(118,4)
rText2.centerx = centerx
sBox = pygame.Surface.convert_alpha(pygame.Surface((rText2.width, rText2.height)))
sBox.fill((0, 255, 255, 100))
sForeground.blit(sBox, rText2)
sForeground.blit(sText, rText)
i=i+1
# Setup string
sText = fontDefault.render("Setup", 1, (255, 255, 255))
rText = sText.get_rect()
rText.centerx = sForeground.get_rect().centerx
rText.y = i*32+offsy
sForeground.blit(sText, rText)
# Exit/back string
i=i+1
sText = fontDefault.render("Exit", 1, (255, 255, 255))
rText = sText.get_rect()
rText.centerx = sForeground.get_rect().centerx
rText.y = i*32+offsy
sForeground.blit(sText, rText)
##################################
def input(events):
# Gestisce gli eventi di input
global iItemSelected
##################################
for event in events:
if event.type == KEYDOWN:
if event.key == K_UP:
iItemSelected -= 1
elif event.key == K_DOWN:
iItemSelected += 1
elif event.key == K_ESCAPE:
sys.exit(0)
else:
print event
########################################################
# Main
########################################################
iItemSelected =0

# Main loop
while True:
sForeground = pygame.transform.scale(sBackground, iiResolution)
input(pygame.event.get())
pygame.display.flip()
drawMenu(strCurrentMenu, iItemSelected)
sScreen.blit(sForeground, (0,0))

domenica 28 giugno 2009

Atlantide Media Center: prime prove

Nell'ottica di implementare un front-end grafico per la mia linux-box, sto studiando il python e pygame.

Questo è il risultato di un paio d'ore di smanettamento:

#!/usr/bin/python

import pygame, sys, os

from pygame.locals import *

screenwidth = 800
screenheight = 600

pygame.init()

# set screen resolution
pygame.display.set_mode((screenwidth, screenheight))#, pygame.FULLSCREEN)
screen = pygame.display.get_surface()

back_file_name = os.path.join(".","Atlantis_by_aksu.jpg")
back_surface = pygame.image.load(back_file_name)

font = pygame.font.Font(None, 36)
text = font.render("Guarda un film", 1, (255, 255, 255))
textpos = text.get_rect()
textpos.centerx = back_surface.get_rect().centerx
back_surface.blit(text, textpos)

fore_surface = pygame.transform.scale(back_surface, (screenwidth, screenheight))

screen.blit(fore_surface, (0,0))

pos = 0,0

def input(events):
for event in events:
if event.type == MOUSEBUTTONDOWN:
sys.exit(0)
elif event.type == MOUSEMOTION:
global pos
pos = pygame.mouse.get_pos()
screen.blit(back_surface, (pos[0],pos[1]))
else:
print event

# Main loop
while True:
input(pygame.event.get())
pygame.display.flip()

Visualizzare codice sorgente in HTML

Per visualizzare del codice C all'interno di una pagina HTML, ho effettuato i seguenti passi:
  • usato il programma code2html, che non necessita di installazione, basta aprire il pacchetto tar.gz ed estrarre l'eseguibile, e si esegue con il comando code2html codice.c codice.c.html
  • con un editor sostituire ai tab la stringa &#09";" (senza doppi apici), come suggerisce wikipedia
  • ricopiare dal tag "<" pre > al < /pre > ed incollare nel codice html...et voilà
Da notare che il programma code2html gestisce più linguaggi di quelli indicati nella sua homepage, tra cui il python.

Un altro metodo potrebbe essere quello di usare lo SCIntilla Text Editor, e sfruttare la funzione Export→as HTML..., ma non lo sto usando perchè adopera i CSS che in questo blog non posso inserire, inoltre il codice creato è piuttosto complesso.

Un terzo metodo che ho usato oggi a distanza di 6 anni è il seguente:
  1. andare alla pagina https://www.palfrader.org/code/code2html/cgi/
  2. riempire il form e cliccare invia richiesta (si può lasciare il campo HTML title vuoto)
  3. cliccare con il tasto destro sulla pagina creata, visualizzare il sorgente e copiare la parte che ci interessa compresa tra i tag PRE
Un altro sito utile per la formattazione in HTML è hilite.me che supporta molti più linguaggi rispetto al link precedente.

Ultimo usato: tohtml.com

martedì 23 giugno 2009

Configurazione di firefox

Se per qualcuno Firefox è sicuramente il miglior browser sulla piazza (me compreso) è grazie alla sua configurabilità e alle estensioni, che rendono la navigazione in internet una gran comodità; (certo non è stato esente da problemi, come quando si freezava ogni 3 per 2 e per la gestione delle animazioni flash).

Ecco un breve appunto su come configurarlo al meglio.

Lista delle estensioni utili
  • adblock (plus)
  • Context Search
  • DownThemAll
  • Gmail space
  • Google Bookmarks button
  • Plain Text Links
  • gTranslate (provare quick TransLation)
Configurazione
  • tutte le tab sempre visibili: da about:config mettere browser.tabs.tabMinWidth a 0
  • scrivere nella barra indirizzi rallenta: da about:config mettere
browser.urlbar.matchOnlyTyped = True
browser.urlbar.matchBehaviour = 2 (provare 0 che con 2 mi si blocca)
browser.urlbar.maxRichResults = (max results, put between 2-5)
browser.urlbar.search.timeout = (search timeout, put something lower than 100, depending on ur needs)
Motori di ricerca da impostare
  • wikipedia en, it
  • wordreference en-it
  • de mauro paravia
  • virgilio sinonimi & contrari
  • wordnet
  • acronymfinder

domenica 14 giugno 2009

Chi fa da se fa per tre

Freevo, il media center che sto usando adesso, non mi sta soddisfacendo troppo:
- è di installazione complicata
- spesso alcune funzioni indicate nel wiki non vanno (ad esempio per giocare con il mame)
- per far funzionare la tv sia in visualizzazione che in registrazione bisogna evocare antichi riti voodoo
- le istruzioni per l'installazione non sono sufficienti

Ad esempio ho scoperto da poco che per poter funzionare correttamente freevo ha bisogno di lanciare altri processi suoi, separatamente e rigorosamente a mano...ma non è indicato da nessuna parte...molto utile!

Dopo diversi mesi di utilizzo di freevo, ho deciso di provare ad impostare da me un mio media center, appoggiandomi ai programmi che ho potuto vedere in azione finora, come ad esempio mplayer.

Con Mplayer, infatti, si possono eseguire operazioni di visualizzazione filmati, canali tv e la possibilità di registrarli facilmente.

L'idea è quindi quella di implementare un front-end grafico, che permetta l'esecuzione di Mplayer per le suddette operazioni, con l'aggiunta della possibilità di lanciare il mame per i giochi da bar.

Il front-end sarà implementato in Python, linguaggio che non conosco ma che sembra abbastanza facile, assieme alla libreria pygame che fornisce immediate funzionalità grafiche senza dover conoscere l'hardware sottostante.

lunedì 1 giugno 2009

Freevo & il topo

Non avendo ancora acquistato un telecomando per controllare freevo, mi sono inventato un modo per poter usare in alternativa il mouse.

Ho appositamente creato una pagina nel wiki di freevo, nella quale descrivo come si configura.

Quello che non ho indicato, ma che potrebbe essere utile farlo in un altra pagina del wiki, è come lanciare freevo dopo che la fase di avvio del mediabox è terminata.

Ho deciso infatti di non eseguire automaticamente freevo, visto che potrei avere bisogno del media box solo come server (mldonkey o file) e non per vedere un film. Inoltre, l'esecuzione di freevo incrementa l'uso della CPU dal 3 al 30% (in modalità idle!), per cui in ottica di risparmio energetico e di durata di componenti hardware ho deciso di lanciarlo solo in caso di necessità.

Login automatico

La prima cosa da fare è quella di impostare il login automatico: si compila il semplice file dal nome autologin.c contentente:
int main() { execlp( "login", "login", "-f", "nomeutente", 0); }
dove al posto di nomeutente si mette l'utenza con cui si vuole effettuare l'accesso automatico.

Poi si modifica il file /etc/event.d/tty1 (/etc/init/tty1.conf) in modo che risulti simile a questo:


start on stopped rc2
start on stopped rc3
start on stopped rc4
start on stopped rc5

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

respawn
exec /sbin/getty -n -l /usr/local/sbin/autologin 38400 tty1
dove /usr/local/sbin/autologin è il programma compilato poco sopra.


Segnalazione di boot terminato

Nel file .bashrc, eseguito automaticamente nel passo precedente, si mette alla fine la seguente sequenza di comandi:
if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
beep
./mousem
fi
Con beep si intende un comando che esegue un suonetto, disponibile nella fattispecie eseguendo "sudo apt-get install beep" da terminale. Se non si sente il suonetto, probabilmente è disabilitato nel file /etc/modprobe.d/blacklist, riabilitarlo commentando la riga "blacklist pcspkr".


Lancio di freevo a schermo spento

Il comando mousem del passo precedente è un altro applicativo scritto in c da compilare
#include <stdio.h>
#include <gpm.h>
#include <unistd.h>

int my_handler(Gpm_Event *event, void *data) {
switch(event->buttons) {
case 1:
printf("tasto dx\n");
break;
case 2:
printf("tasto cx\n");
break;
case 4:
printf("\a\n");
execl("/home/zac/vai.sh", "vai.sh", (char *)0);
break;
}
return 0;
}

int main() {
Gpm_Connect conn;
int c;
conn.eventMask = ~0; /* Want to know about all the events */
conn.defaultMask = 0; /* don't handle anything by default */
conn.minMod = 0; /* want everything */
conn.maxMod = ~0; /* all modifiers included */

if(Gpm_Open(&conn, 0) == -1)
printf("Cannot connect to mouse server\n");

printf("mouse menù\n");

gpm_handler = my_handler;
while((c = Gpm_Getc(stdin)) != EOF)
printf("%c", c);
Gpm_Close();
return 0;
}
Questo programma associa al tasto sinistro del mouse l'esecuzione di un programma a nostra scelta, nella fattispecie lo script vai.sh che contiene:
#!/bin/sh
xinit
./mousem
che esegue il server x, e quando si esce da freevo rilancia automaticamente il programma che ascolta il mouse.