12 dicembre, 2007

Bash: Come richiedere una password senza mostrarla sul terminale

In bash per richiedere l'input dell'utente si usa la funzione read. Ad esempio:

read -p "Inserisci il nome utente:" username

L'utente batte sulla tastiera il suo nome utente che verrà visualizzato a video e quando premerà il tasto invio la stringa verrà assegnata alla variabile shell $username. Cosa succede se vogliamo però richiedere una password? Di certo non vogliamo che questa venga visualizzata sul terminale. In questo caso è possibile usare il comando stty in questo modo

stty -echo #disabilitiamo l'output sul terminale
read -p "Inserisci la password:" password
stty echo #riabilitiamo l'output sul terminale

14 novembre, 2007

Guitar Rig perfettamente funzionante su linux! E' possibile?

Sono un linuxaro convinto e lo uso praticamente per tutto. Una cosa ancora mi lega al dual boot con windows: i software audio! In questi giorni però ho fatto un grande passo avanti per colmare questa lacuna. Grazie a wine e a wineasio una estensione per wine che ho scoperto da poco, uno dei software ai quali tengo di più, gira perfettamente sulla mia Ubuntu Gutsy. Ho deciso quindi di postare un breve tutorial per mostrare come ottenere l'ambito risultato.
I passi da seguire sono i seguenti:

  1. Installare il software necessario alla compilazione di wineasio
  2. Scaricare e compilare wineasio
  3. Configurare wine
  4. Installare Guitar Rig
  5. Suonare con la bava alla bocca godendo come un porco nel vedere il Guitar Rig sulla nostra Ubuntu box
  6. Ripetere periodicamente il passo 5 :)
Per compilare wineasio abbiamo bisogno dei pacchetti di sviluppo di wine e di jack che sono rispettivamente, wine-dev e libjack-dev. Dopo aver installato questi pacchetti preleviamo l'ultima versione dei sorgenti di wineasio da http://people.jacklab.net/edogawa/files/wineasio/
Estraiamo i pacchetti in una directory temporanea a digitiamo il comando make. Se la compilazione non da errori possiamo installare il pacchetto con il comando:
sudo make install
Ora dobbiamo configurare wine in modo che utilizzi i driver corretti per l'audio. Prima di tutto eseguire il comando:
regsvr32 wineasio.dll

Lanciamo il comando winecfg e impostiamo i parametri per l'audio in questo modo:


Bisogna selezionare il driver jack e quello alsa. Ora avviamo jack. Quindi non ci rimane che installare il Guitar Rig e impostare come driver audio wineasio. Per ottenere migliori prestazioni è conveniente installare il kernel realtime (linux-image-rt in Gutsy).

03 novembre, 2007

Tip: vim e indentazione del codice python

Spesso il codice python che troviamo in rete è indentato usando 4 spazi piuttosto che ad esempio un carattere di tabulazione. Io generalmente preferisco la tabulazione agli spazi. Convertire dall'una all'altra indentazione è in realtà piuttosto semplice, così semplice che ci ho pensato davvero tardi ouch ;)
Basta infatti una semplice sostituzione con vim:


:%s/    /\t/g


Ecco, tutto qui :)

24 settembre, 2007

Tip: Disabilitare il bip della console!

A lavoro non ho il mio laptop ma un vecchio desktop che ho riportato a nuova vita con Ubuntu naturalmente ;)

Da un bel po di tempo ero infastidito dal maledetto bip del terminale che veniva emesso ogni volta che un mio dito (uno qualsiasi :) ) andava a premere sul tasto tab.

Oggi mi son deciso a trovare una soluzione e la scrivo qui sul blog, magari sarà utile a qualcuno di voi. Basta usare il comando:

$ xset b off

nel terminale. Per farlo eseguire in modo automatico ogni volta che apriamo una console è consigliabile aggiungere una riga alla fine del file ~/.bashrc con il suddetto comando.

16 settembre, 2007

Come compilare una release candidate del kernel

Ho da qualche giorno installato la gutsy aggiornando la mia perfettamente funzionante feisty e purtroppo il kernel 2.6.22 fornito con la gutsy mi ha dato qualche noia di non poco conto. Per qualche strano motivo, avviando il pc usando questa versione del kernel dopo qualche minuto la macchina si spegne "violentemente" come se venisse a mancare tutto ad un tratto l'alimentazione. Il problema sembra sia causato dalla gestione dell'acpi nel kernel. Infatti passando il paramentro acpi=off al boot, il problema non si pone. Ma disattivare l'acpi significa rinunciare ad alcune importanti funzionalità come ad esempio la gestione dello scaling della frequenza della cpu, funzionalità fondamentale per il mio laptop. In ogni modo ho segnalato il bug su launchpad nella speranza che venga risolto prima della release ufficiale della gutsy.

Comunque tornando all'oggetto del titolo del post, per verificare se il problema è stato risolto nella versione di sviluppo del kernel ho deciso di compilare la versione di sviluppo corrente (nel momento in cui scivo la 2.6.23rc6).

Di cosa ho bisogno?

Prima di iniziare assicurarsi di aver installato i pacchetti bulid-essential, kernel-package e fakeroot. Il primo è necessario alla compilazione vera e propria mentre gli altri due serviranno a renderci la vita un po più semplice. A questo punto occorre scaricare l'ultima versione stabile del kernel e la patch per la versione di sviluppo. Nel mio caso l'ultima versione stabile è la 2.6.22.

N.B.
La patch può essere applicata solo al ramo principale! In pratica non può essere usata ad esempio la versione 2.6.22.6 ma solo la 2.6.22.

La versione corretta da scaricare e sulla quale applicare la patch è in genere linkata a destra della patch con la lettera B.

Quindi procediamo e scarichiamo il file linux-2.6.22.tar.bz2 e la patch cioè il file patch-2.6.23-rc6.bz2

Come procedo per la compilazione?

Prima di tutto occorre estrarre l'archivio con i sorgenti del kernel e applicare la patch. Creiamo una directory nella nostra home che chiameremo tmp e estraiamo i sorgenti del kernel. A questo punto avremo la directory ~/tmp/linux-2.6.22. Decomprimiamo la patch e copiamola all'interno di ~/tmp/linux-2.6.22. Applichiamo la patch con:

patch -p1 < patch-2.6.23-rc6  
A questo punto è fortemente consigliato importare la configurazione del kernel correntemente in uso o dell'ultima versione installata. Per farlo basta copiare il file

cp /boot/config-2.6.22-11-generic ~/tmp/linux-2.6.22/.config
Nel vostro caso la versione potrebbe essere differente.

A questo punto basta usare il comando:

make-kpkg --rootcmd fakeroot kernel_image

Probabilmente nella release candidate del kernel saranno state aggiunte nuove opzioni di configurazione non presenti nel file che abbiamo copiato dalla directory /boot. Per queste nuove opzioni vi verranno poste delle domande. In genere se non si hanno esigenze particolari è conveniente mantenere i valori di default.

Se tutto va a buon fine al termine dell'esecuzione del comando dovreste ritrovarvi un file .deb con il nuovo kernel pronto ad essere installato.

Nel mio caso purtroppo il problema non è stato risolto :( Non mi resta che confidare nei valorosi sviluppatori di Ubuntu.

Buona sperimentazione ;)

P.S.
Dopo aver installato il kernel è necessario generare l'immagine del disco ram iniziale con il
comando:

update-initramfs -c -k 2.6.23-rc6

e quindi aggiornare la voce relativa nel file di configurazione di grub in /boot/grub/menu.lst

In realtà quest'ultima operazione avrebbe dovuto essere automatica ma evidentemente per qualche motivo non ha funzionato.

17 luglio, 2007

Lode a Mark

Di solito non sono uno a cui piace idolatrare e l'ho fatto davvero pochissime volte ma in questo caso una persona merita tutta la mia ammirazione: Mark Shuttleworth.

Quest'uomo infatti non solo ha creato una delle migliori distribuzioni libere in circolazione che ha conquistato (e sta conquistando) il favore di un numero sempre crescente di utenti, ma sembra essere l'unico personaggio di rilievo del mondo open source in grado di fare sempre le mosse giuste per diffondere "di violenza" il software libero. Questo senza nulla togliere agli altri grandi nomi che hanno dato notevoli contributi allo sviluppo e alla diffusione dell'etica e della filosofia libera, ma l'approccio di Mark si sta rivelando decisamente più vincente.

A volte le sue scelte sono state molto criticate (come quella di includere i drivers proprietari in Ubuntu) ma io ho sempre creduto nella sua buona fede e nelle sue idee lungimiranti.

Nascono così progetti importanti come quello di Dell, Gobuntu e il Laptop Libero che vogliono quasi intimare alle varie aziende: "Si ubuntu usa i drivers proprietari ma solo per non fare un torto ai suoi utenti. State attente perché stiamo lavorando al modo di boicottare i vostri prodotti chiusi!"

Le guerre si combattono con le politiche aggressive (per quanto sia possibile naturalmente) e non con idee timide e poco flessibili.

Forza Mark, hai tutto il mio appoggio!

21 giugno, 2007

Tip: Bash, no alla history!

La shell bash mantiene nella nostra home un file chiamato .bash_history nel quale memorizza gli ultimi comandi digitati. La history può risultare molto comoda in alcuni casi ma può essere sconveniente e mantenere informazioni sulla nostra privacy in altre.

Esempio: l'utente tizio ha un account shell su un sistema remoto e non vuole che nessuno (neppure l'amministratore) venga a conoscenza dei comandi che ha eseguito su quel sistema (consideriamo l'utente in buona fede :) ). Ma i comandi sono memorizzati tutti nel file dalla history!

Per fortuna bash permette di impostare il numero dei comandi mantenuti nella history. Per farlo basta impostare la varibile d'ambiente HISTSIZE. Nel nostro caso (per eliminare proprio la history) basta impostare la HISTSIZE a zero.

11 giugno, 2007

VirtualBox, la virtualizzazione a portata di tutti?

Oggi ho fatto un po di test sulle varie soluzioni disponibili per far girare alcune applicazioni windows su linux come ad esempio Microsoft Office (in modo particolare Access) e Adobe Writer. Si lo so che esistono le alternative, ed io non sento proprio la mancanza di questi software, ma mi è stato richiesto di valutare le possibili soluzioni al problema. I nuovi documenti verranno creati utilizzando software libero ma dove lavoro vogliono essere sicuri di avere piena compatibilità con quelli esistenti. Quando si parla di applicazioni windows su linux, la prima soluzione che viene in mente è wine. Allora ho provato ad installare office 2003 sotto wine, ma l'installazione non è andata a buon fine e non c'è stato verso di farlo funzionare. Ho tentato con la versione trial di cross over ma anche qui con successo marginale. Nonostante la versione 2003 è menzionata tra quelle supportate infatti, (anche se il supporto non include Access), sia Word che Excel mi sono sembrati non molto stabili. L'unica soluzione che rimane (almeno che io sappia) è virtualizzare l'intero sistema operativo e installarci su i vari software.

A questo punto le alternative sono due: Vmware, o VirtualBox. Confesso di aver usato sempre Vmware ma visto che VirtualBox è GPL ho deciso di dargli una possibilità.

In realtà sul sito di VirtualBox è possibile scaricare solo il sorgente in GPL mentre i pacchetti binari sono sotto una licenza non libera (chissà poi perché e soprattutto perché non si trovano in giro pacchetti deb compilati dal sorgente e rilasciati sotto la GPL). In ogni modo se dovevo scegliere virtual box per la sua licenza non avrebbe avuto senso utilizzare i pacchetti precompilati e quindi ho deciso di compilarlo da me. Per fortuna la compilazione è filata liscia seguendo le istruzioni che si trovano sul sito ufficiale.

Lancio finalmente VirtualBox e mi accorgo che è effettivamente un software con grandi potenzialità. Purtroppo però ha ancora delle pecche che mi hanno riportato quasi (dico quasi perché ancora non sono del tutto convinto) a scegliere Vmware che nella versione Server è comunque gratuito (anche se non open source purtroppo):

  1. Avviando una sessione X in una macchina virtuale si hanno due puntatori del mouse che confondono molto il gatto e soprattutto l'utente.
  2. Non ho trovato le impostazioni del bios (come si hanno invece in vmware). Qui nessun fastidio per il gatto ma potrebbe essere utile all'utente.
  3. Perché per default è impostato il tasto Ctrl destro per ridare il focus alla macchina reale? Non lo sanno che molti portatili (se non tutti e compreso il mio) non hanno quel tasto? E come si imposta (se è impostabile) una alternativa? Non ho trovato una voce nei menù!
  4. Vmware offre maggiori possibilità nella configurazione della rete tra le macchine virtuali e la macchina reale.
VirtualBox è un gran bel software però per ora Vmware ha qualcosa in più!

26 maggio, 2007

Aggiornamenti sul blog

Se non scrivo da un po su questo blog non è per pigrizia o perché ho deciso di abbandonarlo ma perché martedì mi sono laureato e da allora non ho proprio acceso il pc. Sto dedicando tutto il mio tempo a suonare e a godermi qualche giorno di meritato riposo. Credo che continuerò ancora per qualche tempo, ma prima o poi mi deciderò a riprendere le mie normali attività. Rimanete connessi!

14 maggio, 2007

Python Cairo e le glass window

Chi non conosce il lavoro di njpatel? Ormai i suoi avant window navigator e affinity sono noti ai più. Le sue idee sono innovative è apprezzate da molti bloggers. In questo post non voglio solo esaltare le sue produzioni (anche perché arriverei molto in ritardo in questo) ma voglio spingermi un po oltre per spiegare il modo di operare per ottenere risultati visivi simili ma utilizzando il nostro amato pitone.

A chi non sapesse a cosa mi riferisco, rimando a questo post sul blog di njpatel. Notate le trasperenze della finestra e gli altri widget inseriti normalmente al suo interno.

Come faccio ad ottenere un risultato simile in python?


#!/usr/bin/env python

import gtk
import cairo

if gtk.pygtk_version < (2, 10, 0):
print 'Questo esempio ha bisogno delle PyGtk >= 2.10'
raise SystemExit

def hex2float(hex):
ret = []
for i in range(4):
ic = int(hex[i])
ret.append( ic / 255.0 )
return ret


class TransparentWindow(gtk.Window):
__gsignals__ = {
'expose-event': 'override',
'screen-changed': 'override',
}

def __init__(self):
gtk.Window.__init__(self)

# Indichiamo alle GTK che vogliammo disegnare noi lo sfondo.
self.set_app_paintable(True)

# non vogliamo le decorazioni del window manager
self.set_decorated(False)

# usiamo il segnale button-press-event per permettere
# il "click e trascina" sulla finestra. Ricordiamo
# che non stiamo utilizzando i classici decoratori
# del window manager e non gestendo qeusto segnale
# non sarebbe possibile spostare la finestra
self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
self.connect('button-press-event', self.on_button_press)

# Inizializziamo lo schermo
self.do_screen_changed()

def on_button_press(self, widget, event):
self.begin_move_drag(
event.button,
int(event.x_root),
int(event.y_root),
event.time)

def render_rect(self, cr, x, y, w, h, o):
# Crea un rettangolo con i bordi arrotondati
x0 = x
y0 = y
rect_width = w
rect_height = h
radius = 10 + o

x1 = x0 + rect_width
y1 = y0 + rect_height
cr.move_to(x0, y0 + radius)
cr.curve_to(x0, y0, x0, y0, x0 + radius, y0)
cr.line_to(x1 - radius, y0)
cr.curve_to(x1, y0, x1, y0, x1, y0 + radius)
cr.line_to(x1 , y1)
cr.line_to (x0 , y1)
cr.close_path()

def do_expose_event(self, event):
cr = self.window.cairo_create()

if self.supports_alpha:
cr.set_source_rgba(1.0, 1.0, 1.0, 0.0)
else:
cr.set_source_rgb(1.0, 1.0, 1.0)

cr.set_operator(cairo.OPERATOR_SOURCE)
cr.paint()


(width, height) = self.get_size()
cr.move_to(0, 0)
cr.set_line_width(1.0)

cr.set_operator(cairo.OPERATOR_OVER)

pat = cairo.LinearGradient(0.0, 0.0, 0.0, height)

ex_list = [0xA1, 0xA8, 0xBB, 0xEC]
col = hex2float(ex_list)
pat.add_color_stop_rgba(0.0, col[0], col[1], col[2], col[3])

ex_list = [0x14, 0x1E, 0x3C, 0xF3]
col = hex2float(ex_list)
pat.add_color_stop_rgba(1.0, col[0], col[1], col[2], col[3])

self.render_rect(cr, 0, 0, width, height, 10)
cr.set_source(pat)
cr.fill()

# bordo luminoso
ex_list = [0xFF, 0xFF, 0xFF, 0x4e]
col = hex2float(ex_list)
cr.set_source_rgba(col[0], col[1], col[2], col[3])
self.render_rect(cr, 1.5, 1.5, width - 3 , height - 3, 10)
cr.stroke()

# bordo
ex_list = [0x00, 0x15, 0x1F, 0xe0]
col = hex2float(ex_list)
cr.set_source_rgba(col[0], col[1], col[2], col[3])
self.render_rect(cr, 0.5, 0.5, width - 1 , height - 1, 10)
cr.stroke()

ex_list = [0xFF, 0xFF, 0xFF, 0xFF]
col = hex2float(ex_list)
cr.set_source_rgba(col[0], col[1], col[2], col[3])
self.render_rect(cr, 0, 0, width , height, 10)
cr.stroke()

pat = cairo.LinearGradient(0.0, 0.0, 0.0, height)
cr.set_source(pat)
ex_list = [0xFF, 0xFF, 0xFF, 0xbb]
col = hex2float(ex_list)
pat.add_color_stop_rgba(0.0, col[0], col[1], col[2], col[3])

ex_list = [0x00, 0x00, 0x10, 0xaa]
col = hex2float(ex_list)
pat.add_color_stop_rgba(0.2, col[0], col[1], col[2], col[3])
self.render_rect(cr, 0, 0, width, 20, 10)
cr.fill()

# chiediamo esplicitamente ai figli di disegnarsi
# Se non lo facessimo non sarebbero visualizzati
# i widgets aggiunti alla TransparentWindow
children = self.get_children()
for c in children:
self.propagate_expose(c, event)

def do_screen_changed(self, old_screen=None):
screen = self.get_screen()
if self.is_composited():
print 'Il tuo schermo supporta il canale alpha!'
colormap = screen.get_rgba_colormap()
self.supports_alpha = True
else:
print 'Il tuo schermo non supporta il canale alpha! Il composite\
manager e\' attivo?'
colormap = screen.get_rgb_colormap()
self.supports_alpha = False
self.set_colormap(colormap)

class CoolAlpha:
def __init__(self):
window = TransparentWindow()
window.resize(400, 400)
eb = gtk.EventBox()
eb.set_visible_window(False)
eb.set_border_width(12)
window.add(eb)

main_box = gtk.VBox(False, 12)
eb.add(main_box)

hbox = gtk.HBox(False, 6)
main_box.pack_start(hbox, False)

button = gtk.Button()
button.set_relief(gtk.RELIEF_NONE)
button.connect("clicked", gtk.main_quit)
icon_box = gtk.HBox(False, 0)

image = gtk.Image()
image.set_from_stock(gtk.STOCK_CLOSE,
gtk.ICON_SIZE_MENU)
icon_box.pack_start(image, False)
button.add(icon_box)
hbox.pack_end(button, False)

sw = gtk.ScrolledWindow()
sw.set_property("border-width", 20)
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.textview = gtk.TextView()
self.textview.set_editable(False)
self.textview.set_cursor_visible(False)
sw.add(self.textview)
main_box.pack_start(sw, True)

window.show_all()

def set_text(self, text):
buf = self.textview.get_buffer()
buf.set_text(text)

if __name__ == '__main__':
a = CoolAlpha()
a.set_text("prova")
gtk.main()

Questo esempio è in gran parte una traduzione del codice in linguaggio c di affinity di njpatel con qualche piccolo ritocco da parte mia come l'inclusione del pulsante di chiusura in alto a destra e la textview centrale. Eseguendo l'esempio otterrete:

In genere le gtk non vengono usate per costruire finestre troppo "esotiche" e c'è un buon motivo per questo, ovvero mantenere la consistenza delle applicazioni sul desktop. Quindi nonostante queste finestre possono apparire molto belle a vedersi, il mio consiglio e di non abusarne ma utilizzarle in modo da ottenere una buona integrazione con il resto del desktop per non fare apparire la nostra applicazione come un "alieno".

13 maggio, 2007

Vmware Server su Ubuntu Feisty

Vi piace provare le nuove distro magari in beta o volete fare sperimentazioni di programmazione in rete ma non avete a disposizione i pc per farlo? La soluzione c'è e si chiama virtualizzazione. Vmware server è un software gratuito (non open source purtroppo) che dalla versione feisty è impacchettato e disponibile nei repository di software commerciale di canonical.

Installazione
Per installare vmware server è necessario prima di tutto abilitare i repository "non liberi" di canonical:

deb http://archive.canonical.com/ubuntu feisty-commercial main"
Per farlo è possibile utilizzare synaptic o editare manualmente il file /etc/apt/sources.list
A questo punto è possibile installare il software usanto il comando:
sudo apt-get install vmware-server
L'installazione vi richiederà un codice di attivazione che potete ottenere gratuitamente sul sito di vmware

10 maggio, 2007

Baby e ybab: uno script python per usare i dizionari babylon

E' da tanto che non scrivo? Lo so ma fra qualche giorno se tutto procede come previsto dovrei laurearmi quindi il tempo da dedicare al blog è praticamente inesistente. Appena tutto sarà finito tornerò a sviluppare cGmail e a postarvi gli studi su python e tutto il resto. Per ora, per non lasciarvi proprio a bocca asciutta, vi propongo un piccolo "bocconcino" che ho sviluppato qualche tempo fa e che potrebbe risultare utile (o quantomeno potrebbe essere uno spunto) a qualcuno di voi. Si tratta di un semplice script (indovinate in che linguaggio? . . . Bravi :) ) che interroga il database dei dizionari babylon, si presenta come Firefox 2 e poi interpreta l'html per tirare fuori le informazioni sul lemma ricercato.

Il codice python


#! /usr/bin/env python
import urllib2
import re
import sys
from sgmllib import SGMLParser

red='\033[0;31m'
RED='\033[1;31m'
blue='\033[0;34m'
BLUE='\033[1;34m'
cyan='\033[0;36m'
CYAN='\033[1;36m'
NC='\033[0m'

ROWLEN = 60

class Parser(SGMLParser):
def __init__(self):
SGMLParser.__init__(self)
self.must_print = False

def reset(self):
SGMLParser.reset(self)

def write(self, data):
sys.stdout.write(data)
sys.stdout.flush()

def start_div(self, attrs):
for attr, value in attrs:
if attr == "class":
if value == "term":
self.write(RED + '\n')
self.must_print = True
if value == "definition":
self.must_print = True

def end_div(self):
self.must_print = False
self.write(NC)

def handle_data(self, data):
if not self.must_print: return
if data.strip() == "": return
tmp = data.strip()
tmp = data.replace('\n', '')
count = len(tmp)
if count > ROWLEN:
pieces = count / ROWLEN
for i in range(pieces):
l = ROWLEN * i
u = ROWLEN * (i + 1)
self.write(tmp[l:u] + '\n')
else:
self.write(tmp + '\n')



def http_req(url, data):
req = urllib2.Request(url, data)
req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20061201 Firefox/2.0.0.4 (Ubuntu-feisty)')
req.add_header('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7')
req.add_header('Accept', 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5')
stream = urllib2.urlopen(req)
out = stream.read()
stream.close()
return out


def usage():
print "Usage: baby parola\n";

def search(word, lang):

out = http_req('http://info.babylon.com/onlinebox.cgi',
'rt=ol&tid=pop&uil=EN&cid=CD1&term='+word+'&tl='+lang)
return out


if __name__ == "__main__":
import os
args = sys.argv[1:]
if args[0] == None:
usage()
sys.exit(1)
word = args[0]
out = ""
appname = os.path.basename(sys.argv[0])
print appname
if appname == "baby":
out = search(word, "EN")
elif appname == "ybab":
out = search(word, "IT")
p = Parser()
p.feed(out)
p.close()

Come lo installo?
Copiate ed incollate il codice in un file che chiamerete baby (Attenzione: il nome è importante). Date i permessi di esecuzione al file e copiatelo in una directory inclusa nel vostro path (ad esempio /usr/local/bin). A questo punto create un link simbolico al file con nome ybab. Esempio di tutti i passaggi (supponiamo che avete salvato lo script di cui sopra su un file di nome baby sul vostro desktop):

sudo cp ~/Desktop/baby /usr/local/bin
sudo chmod +x /usr/local/bin/baby
sudo ln -s /usr/local/bin/baby /usr/local/bin/ybab

Come si usa?
L'uso è semplicissimo. Invocando baby [lemma_da_cerare] verrà considerata come lingua target l'inglese, invocando invece ybab [lemma_da_cercare] verrà considerato come target l'italiano.

Esempio:

$ ybab glad
ybab

glad
agg.
felice, contento, lieto; gioioso
s.
gladiolo (fiore)

GLAD
CONTENTO. LIETO. FELICE. ALLIETARE. RALLEGRARE. GLADIOL
Purtroppo per alcuni lemmi l'output non è così pulito (ci sarebbe da migliorare il parser, suggerimenti sono ben accetti. Io non mi ci sono dedicato più di tanto)

Come funziona
Le informazioni che seguono sono piuttosto tecniche. Se vi interessa solo il programmino e non sapere come funziona potete tranquillamente evitare di proseguire nella lettura.

Lo script utilizza la urllib2 di python per fare una semplice richiesta al sito di babylon. Per conoscere l'esatto URL da interrogare e i parametri da passargli è necessario studiarsi un po il sito, conoscere un minimo di programmazione web, sapere come funzionano le form ed avere un po di pazienza. Una volta noto il meccanismo di interrogazione utilizzato dal sito in questione, il resto è "semplice". In questo caso l'output della richiesta http, viene "parsato" (passatemi il termine) dall'apposito parser che utilizza la libreria sgmllib. Un aspetto interessante dello script è il modo che utilizza per cambiare la sua funzionalità (in questo caso la lingua target). Ricordiamo che il primo parametro passato ad un programma è sempre il suo nome. Quindi distinguendo il nome del primo parametro è possibile effettuare operazioni diverse
. In questo caso se il programma viene invocato come baby viene utilizzata la lingua inglese, mentre invocato come ybab quella italiana.

29 aprile, 2007

pygtk: un About Dialog con link cliccabile

Creare un about dialog con link di riferimento cliccabile è una di quelle cose che vediamo in molte applicazioni ma per la quale non è semplice trovare documentazione a riguardo.

Scoprire come fare per me non è stato semplicissimo e quindi ho pensato che una soluzione pronta potrebbe essere di aiuto a qualcuno.

Cosa stiamo per realizzare
Ciò che ci apprestiamo a realizzare è un dialogo di informazione come quello che potete vedere in figura:


Da notarsi che il link è cliccabile e cliccandoci sopra verrà aperto un browser che vi porterà guarda caso proprio a quell'indirizzo :) Le librerie gtk (e i rispettivi bindings per python) mettono a disposizione un apposito widget per creare i dialoghi di informazione. Il widget in questione permette di settare facilmente il nome dell'applicazione, la versione, gli autori, la licenza, i traduttori e altre cosette interessanti. Stranamente però non permette di impostare in modo altrettanto semplice un url che risponda al click del mouse. Per farlo è necessario utilizzare la funzione gtk.about_dialog_set_url_hook e indicare una callback da richiamare quando l'utente clicca sul link. La callback in questione dovrà poi occuparsi di creare un nuovo processo per lanciare il browser.


Il codice python



import gtk
import subprocess

def on_url(d, link, data):
subprocess.Popen(["firefox", "http://linubuntu.blogspot.com"])

gtk.about_dialog_set_url_hook(on_url, None)

def create_dialog():
dlg = gtk.AboutDialog()
dlg.set_version("0.1")
dlg.set_name("app")
dlg.set_license("Puoi fare di questo software quello che ti pare")
dlg.set_authors(["redgun"])
dlg.set_website("http://linubuntu.blogspot.com")
def close(w, res):
if res == gtk.RESPONSE_CANCEL:
w.hide()
dlg.connect("response", close)
return dlg

if __name__ == "__main__":
dlg = create_dialog()
dlg.run()


Ricordate che la finestra di dialogo di suo non risponde al click sul pulsante chiudi ma sarà necessario impostare una funzione di callback per il segnale response come nel codice.

27 aprile, 2007

Una chicca da Fedora 7

Era da tanto che non mi interessavo alla mia vecchia distribuzione (vedi qui). Oggi noto su ditsrowatch che è uscita la versione test 4 di Fedora 7. Dalle note di rilascio scopro che adesso anche fedora usa il sistema a live cd installabile, che non ha ancora abbandonato yum (credo che non esista un gestore di pacchetti peggiore), e che usa un nuovo tema di icone. Ok, mi dico, vediamo questo tema e cerco uno screenshot. Trovo questo:


Le icone sono carine ma un'altra cosa mi colpisce: la finestra delle preferenze si sviluppa su due livelli, un piccolo colpo di genio a mio parere.
Questa credo sia un ottima soluzione per il menù delle preferenze. L'altra opportunità sarebbe il centro di controllo gnome, ma la trovo poco funzionale. Il centro di controllo non è così immediato come i menù. Ecco come compare invece il menù delle preferenze sul mio desktop:

Decisamente meglio quello di fedora. Per una volta devo bastonare Ubuntu eh eh :)


P.S. Oggi blogger sembra avere qualche problema e a volte non compaiono gli articoli recenti e i commenti recenti del blog. Mi scuso per l'inconveniente.

23 aprile, 2007

Ubuntu Feisty: Impressioni d'uso

Ormai uso Feisty da circa un mesetto e a questo punto posso esprimere le mie valutazioni.

La mia storia con linux
Ho iniziato ad usare linux all'epoca della Mandrake 8 (poco prima avevo provato una SuSE [non ricordo quale versione]). Ho abbandonato Mandrake per una RedHat 9 sulla quale ho iniziato le "sperimentazioni serie", dalla ricompilazione del kernel, allo studio e modifica del processo di avvio, alla configurazione manuale di devices all'epoca del kernel 2.4 un po esotici come il bluetooth etc. Ho usato fedora fino alla versione 3 che ho abbandonato perché condividevo poco la sua politica, alla ricerca di una distribuzione che fosse semplice per l'uso quotidiano ma abbastanza aperta da regalarmi succulenti momenti di puro e gudurioso hacking, e mi sono fermato su ubuntu dapper.

Da allora non ho mai più installato un'altra distro. Ubuntu mi piace, amo persino il famoso marrone cacchina tanto contestato, il suo simbolo e tutto il resto.

Mai quanto con la Feisty però avevo avuto la sensazione di puro godimento nell'utilizzo del computer, il senso di quasi morboso piacere nel cliccare ed osservare come un bimbo le barre del progresso colorarsi, il pesce wanda nuotare nel pannello, le finestre fluttuanti danzare sulle loro trasparenze. Il tutto nella consapevolezza della libertà, della libera divulgazione delle conoscenze di un sistema aperto che cresce grazie a noi utenti verso la direzione che noi indichiamo e che nessun altro ci impone.

Ubuntu: la distro perfetta
Ubuntu è quasi perfetta. Mancano solo alcuni piccoli accorgimenti. Stupidaggini come qualche icona vecchiotta ed inconsistente qua e la (vedi menù giochi), qualche piccolo bug sporadico e altre piccolezze.

La prova di ciò è l'interessamento sempre crescente da parte degli utenti per questa distro. Ubuntu Feisty ha stupito anche i suoi stessi sviluppatori quando i mega server che ospitano ubuntu.com e canonical.com erano praticamente irraggiungibili nel giorno del rilascio. Forse avete notato che il sito di ubuntu è stato sostituito per qualche ora con una pagina statica per cercare di diminuire il carico sui servers. Insomma sarà per questo Vista che sembra non riscuotere molto successo, sarà per la consapevolezza di una alternativa che inizia a fare breccia nelle menti ma la comunità di Ubuntu inizia ad ottenere un peso consistente nel palcoscenico mondiale e io non posso che esserne felice!

Buon ubuntu a tutti!

19 aprile, 2007

Un modulo python per gestire le chiavi in gconf

Aggiornamento: ho aggiornato il modulo che è ora una classe ed include il metodo clean_section


L'ambiente desktop gnome mette a disposizione un ottimo sistema per memorizzare le impostazioni delle sue applicazioni: gconf.

Come funziona gconf?
Gconf è un sistema per la memorizzazione delle configurazioni basato su XML. La configurazione è contenuta in un albero ed ogni applicazione può costruire un suo sottoalbero nel quale memorizzare le proprie impostazioni. Gconf è composto da un demone (gconfd), che si occupa di notificare le applicazioni di eventuali modifiche alla loro configurazione (magari fatte da una applicazione esterna come gconf-editor) e di mantenere una cache dei valori in modo che le applicazioni non siano costrette a dover rifare il parsing del file XML ogni volta, e da un insieme di librerie che rendono semplice l'accesso all'albero gconf.


Come posso accedere/creare chiavi gconf con python?
Usare gconf da python è veramente semplice anche se un minimo di astrazione in più non fa certo male. Per questo vi voglio riportare un piccolo modulo python che permette di comprendere l'uso di gconf oltre che semplificare il processo di creazione/accesso/modifica delle chiavi.

Il codice python


import gtk
import gconf


class MyGconf:

def __init__(self, appname):
self.basedir = "/apps/" + appname
self.client = gconf.client_get_default()

def add_section(self, name, keys):
"""
Aggiunge una sottodirectory a self.basedir e la riempie
con le chiavi specificate nel dizionario keys
"""
dir = self.basedir + "/" + name + "/"
for key, value in keys.iteritems():
path = dir + key
self.client.set_string(path, value)

def clean_section(self, name):
"""
cosa potrebbe mai fare questo metodo :)
"""
dir = self.basedir + "/" + name
self.client.recursive_unset(dir, 0)

def get_sections(self):
"""
Ritorna una tupla contenente l'elenco delle sezioni
contenute in self.basedir
"""
return self.client.all_dirs(self.basedir)

def get_key(self, name):
"""
Ritorna il valore di una specifica chiave.
name deve essere un percorso relativo a self.basedir
"""
path = self.basedir + "/" + name
return self.client.get_string(path)

def set_key(self, name, value):
"""
Imposta il valore della chiave name a value
"""
path = self.basedir + "/" + name
self.client.set_string(path, value)




if __name__ == "__main__":
mg = MyGconf("myapp")
params = {
"test": "test value",
"test2" : "test2 value"
}
mg.add_section("mydir", params)
mg.add_section("mydir2", {"test": "value"})

print mg.get_key("mydir/test")
print mg.get_sections()
mg.set_key("mydir/test", "new value")
print mg.get_key("mydir/test")

mg.remove_section("mydir")


Il codice dovrebbe essere autoescplicativo ;)

18 aprile, 2007

Un processore di effetti di chitarra su Ubuntu

Oltre ad essere un utente ubuntu sono anche un discreto chitarrista. Una delle cose che di più mi manca su Ubuntu è un programma di emulazione di amplificatori in grado di permettermi di sfruttare la mia M-Audio Fast Track (lo so che c'è di meglio ma per divertirsi va più che bene) perfettamente riconsciuta da Ubuntu.

Stasera ho deciso di vedere che cosa è in grado di fare la mia linux box nell'ambito dell'effettistica realtime.

Installiamo il necessario
Prima di tutto ho installato il kernel a bassa latenza presente nei repository Ubuntu (linux-image-2.6.20-15-lowlatency). Quando si parla di audio su linux viene subito da pensare al server audio jackd. Questo server per poter avere buone prestazioni in realtime, ha bisogno di alcuni accorgimenti particolari. Infatti è necessario compilare un apposito modulo per il kernel: non lasciatevi intimidire, non è poi cosi difficile. Vediamo come fare. Prima di tutto vi consiglio di installare il pacchetto module-assitant che vi risparmierà un sacco di noie e alla fine produrrà un bel pacchetto deb con ciò di cui abbiamo bisogno.
Prima di procedere è consigliabile riavviare con il kernel lowlatency.

Quindi installiamo il pacchetto realtime-lsm.
A questo punto andiamo a compilare il nostro modulo (assicuratevi di essere ancora connessi ad internet):

$ sudo m-a a-i realtime-lsm
Questo comando scaricherà dalla rete tutto ciò di cui avrà bisogno per compilare il modulo e per costruire il pacchetto .deb. Alla fine dell'operazione installerà automaticamente il pacchetto con il modulo.
E' arrivato il momento di testare il modulo realtime:
$ sudo modprobe realtime any=1
Se il comando dovesse dare degli errori durante il caricamento provate a riavviare (a me è successo e riavviando ho risolto).

Se l'operazione è andata a buon fine possiamo procedere ad installare gli altri pacchetti: jackd, jack-rack, qjackctl, caps.

Siamo finalmente pronti a testare il nostro processore di effetti.
Lanciamo qjackctl ed impostiamo i parametri per il demone jackd (non dimentichiamoci di attivare l'opzione realtime naturalmente). Quindi lanciamo jack-rack e dopo aver fatto le opportune connessioni attraverso qjackctl possiamo caricare gli effetti. I simulatori di amplificatori, di cabinets, di preamplificatori etc si trovano dal pulsante Aggiungi->Uncategorised->C di jack-rack.

Impressioni d'uso
Giocando con le varie impostazioni si riescono ad ottenere alcuni suoni che non sono malaccio anche se non posso dire che siano pienamente soddisfacenti. Altra nota dolente è che sul mio centrino a 1.5 Ghz non riesco a caricare più di 3 o 4 moduli contemporaneamente in jack-rack. In ogni modo mi sento di consigliarvi di provarli anche solo per il gusto di vedere la vostra chitarra processata da software open source :)

17 aprile, 2007

Urban Terror: Ogni tanto meritiamo un piccolo svago:)

Tra uno studio, un lavoro e tutto il resto noi linuxiani amiamo anche passare un po ti tempo a giocare. Visto che purtroppo sulla ubuntu feisty nexuiz sembra avere qualche problemino (almeno sul mio pc crasha non appena inizio una partita) ho cercato delle alternative in rete e ho trovato Urban Terror un gioco davvero ben fatto e divertente da giocare online.



Installazione
Per installare Urban Terror è necessario scaricare questi files dal sito http://www.urbanterror.net/:

  1. UrbanTerror40_full.zip
  2. ioUrbanTerrorInstaller_1.0.zip
  3. http://urt.battleye.com/BEClient_i386.so
  4. http://urt.battleye.com/BEServer_i386.so
A questo punto creiamo una cartella UrbanTerror dove meglio ci pare (ad esempio nella nostra home). Unzippiamo il file ioUrbanTerrorInstaller_1.0.zip in una cartella temporanea e copiamo il contenuto della cartella Linux-i386 nella cartella UrbanTerror che avevamo creato in precedenza.
Ora unzippiamo il file UrbanTerror40_full.zip nella cartella UrbanTerror ed infine copiamo i files BEClient_i386.so e BEServer_i386.so nella cartella UrbanTerror/BattlEye.

Siamo quasi pronti a giocare. Rimane solo da dare i permessi di esecuzione al file UrbanTerror/ioUrbanTerror.i386 ed eseguirlo.

Il gioco
Si tratta di una arena a squadre da giocare online. Si muore molto facilmente (è realistico) ma è molto divertente. Lo consiglio a tutti quelli che dopo una intensa giornata di lavoro sentono l'esigenza di "uccidere qualcuno" (metaforicamente naturalmente :)

Happy gaming!

14 aprile, 2007

Una classe per le notifiche con python e dbus: parte seconda

Qulche tempo fa in questo post avevo spiegato come è possibile generare una notifica utilizzando python e dbus. Il commento di AS in quel post mi ha dato l'ispirazione per approfondire le conoscenze su dbus e per creare questo nuovo post con una versione più evoluta della classe python per le notifiche (vi suggerisco la lettura del post precedente prima).

La nuova bestiola mostra un esempio di come sia possibile aggiungere funzionalità alle notifiche con l'inclusione di pulsanti.

L'esempio chiarisce inoltre come sia possibile posizionare la notifica in un punto arbitrario del desktop.

Il codice python


import dbus
from dbus.mainloop.glib import DBusGMainLoop

ICON = "file:///home/redgun/python/planimo/data/icons/planimo48.png"

class Notifier:
def __init__(self):
dbus_loop = DBusGMainLoop()
self.session_bus = dbus.SessionBus(mainloop = dbus_loop)
obj = self.session_bus.get_object("org.freedesktop.Notifications",
"/org/freedesktop/Notifications")
self.notif = dbus.Interface(obj, "org.freedesktop.Notifications")

self.notif.connect_to_signal("ActionInvoked", self.action_cb)

def action_cb(self, id, act):
print act

def notify(self, title, message, iconfile = ICON, time = 3000):
hints = {}
hints['x'] = 1200
hints['y'] = 50
actions = ["a1", "Azione1", "a2", "Azione2"]
try:
self.notif.Notify("Notification",
dbus.UInt32(0), iconfile, title, message,
actions, hints, dbus.Int32(time), dbus.UInt32(0))
except:
try:
self.notif.Notify("Notification",
dbus.UInt32(0), iconfile, title, message,
actions, hints, dbus.Int32(time))
except Exception, detail:
print detail

if __name__ == "__main__":
n = Notifier()
n.notify("Title", "message <b>bold style</b>", time=10000)

import gobject
loop = gobject.MainLoop()
loop.run()


Il risultato sarà il seguente:



Da notarsi che i pulsanti sono cliccabili e le azioni possono essere gestite all'interno del metodo action_cb. La variabile hints, invece ci permette di impostare le coordinate della notifica sul desktop. Le azioni vengono specificate in una lista dove gli elementi pari rappresentano i nomi delle azioni che andranno a comparire sui pulsanti, mentre quelli dispari rappresentano il valore che verrà passato alla funzione di callback. In questo caso quindi, quando premiamo il pulsante Azione1 la funzione action_cb riceverà nella variabile act il valore a1.

13 aprile, 2007

Ubuntu 7.10: nome in codice Gutsy Gibbon

Ancora prima del rilascio ufficiale di Ubuntu Feisty Fawn, Mark Shuttleworth annuncia il nome della prossima Ubuntu: Gutsy Gibbon. Mark ci riprova e assicura che in Ubuntu 7.10 gli effetti grafici saranno abilitati di default (intanto qui una guida su come abilitarli su Feisty Fawn con una ati 9600/9700).

Gusty Gibbon non sarà una LTS release (Long Term Support) e una delle novità importanti che introdurrà sarà il fatto che uscirà in due edizioni distinte: una versione normale ed una priva di ogni software per il quale non è disponibile il codice sorgente, dai firmware ai drivers proprietari e tutti gli altri materiali come suoni e immagini per i quali non si hanno pieni diritti per la modifica.

Per il resto non ci resta che aspettare ansiosi di vedere quale saranno le altre novità introdotte.

12 aprile, 2007

Modem Alice Adsl Wireless

Se state pensando di fare un abbonamento ad alice adsl e richiedere il modem in comodato d'uso per connettervi via wireless con la vostra amata Ubuntu ve lo sconsiglio per svariati motivi.

1) Non lasciatevi ingannare dal fatto che appare come un router (4 porte ethernet e interfaccia wireless), non lo è. Con l'apparecchio ci si può collegare da un solo computer per volta. (incredibile ma vero. Probabilmente un blocco via firmware)

2) La connessione ad internet deve essere lanciata direttamente dal computer (non è l'aggeggio che lo fa per voi)

3) Non ha praticamente interfaccia di configurazione se non una per lo stato e per l'attivazione della chiave wep o wpa, tra l'altro predefinita e non modificabile, memorizzata in una sorta di scheda tipo sim card.

4) Il segnale wireless fa a dir poco pena. Da una stanza all'altra con un centrino la rete va e viene.

5) Scordatevi qualsiasi tipo di funzionalità avanzata.

6) L'assistenza telecom lascia a dir poco a desiderare

Vi suggerisco quindi, se proprio non potete fare a meno dell'adsl di telecom di quantomeno acquistare un router per conto vostro!

10 aprile, 2007

Pid di un processo a cui appartiene un socket

Come si fa a conoscere il pid di un processo sapendo che è in ascolto su un determinato numero di porta?

Si usa il comando fuser!

Ad esempio supponiamo che sul nostro sistema sia in esecuzione un processo che apre un socket sulla porta 80 (apache ad esempio): per conoscere il pid del processo si può procedere con il comando fuser come segue:

$ fuser -n tcp 80

Questo comando stamperà qualcosa di simile a:

80/tcp: 15136 15140 15141 15142 15143 15144

I numeri che si trovano a destra dei due punti sono tutti pid dei processi facenti uso della porta 80. (in questo caso ne abbiamo più di uno perché apache duplica se stesso quando viene avviato)

Se si tratta di un socket udp è necessario specificarlo al posto di tcp.

N.B. Se il processo appartiene all'utente root è necessario invocare il comando fuser con i privilegi di amministratore e quindi preponendo sudo

05 aprile, 2007

feisty compiz e ati mobility radeon 9600/9700

In questi giorni mi sono finalmente deciso a passare alla beta di ubuntu (feisty). Tutto è filato liscio con un semplice sudo update-manager -d anche se ci ha impiagato circa 4 ore con tutti i pacchetti che avevo installati.

Avendo fesity con il supporto a compiz integrato come non provare il fatidico cubo? Forse ero rimasto uno dei pochi a non averlo ancora visto dal vivo e non mi ero mai impegnato ad installare tutto il necessario.

Scopro però che i drivers proprietari della mia scheda Ati mobility radeon 9700 non supportano l'estensione AIGLX necessaria a compiz. Io ho sempre usato questi drivers perché con quelli open non riuscivo ad abilitare il supporto all'accelerazione 3d.

Con un po di impegno in più, questa volta ci sono riuscito e finalmente ho anch'io i cubi rotanti e le finestre fluttuanti :D

Come procedere?

Prima di tutto se si hanno i drivers proprietari ati è necessario rimuoverli completamente.
Quindi bisogna editare il file xorg.conf con:

sudo gedit /etc/X11/xorg.conf

e fare in modo che le varie sezioni contengano quanto segue:


Section "Module"
........
........
Load "dri"
Load "glx"
........
........
EndSection

Section "Device"
Identifier "ATI Technologies, Inc. RV350 NP [Mobility Radeon 9600/9700 M10/M11]"
Driver "radeon"
...........
Option "AGPMode" "8"
Option "AGPFastWrite" "true"
Option "RenderAccel" "true"
Option "backingstore" "true"
EndSection

Section "DRI"
Mode 0666
EndSection

Section "Extensions"
Option "Composite" "True"
Option "RENDER" "Enable"
Option "DAMAGE" "true"
EndSection

A questo punto non rimane che riavviare X (se non funziona riavviate completamente il sistema operativo)

Assicuratevi che l'accelerazione 3d sia attiva con:

glxinfo | grep direct


deve comparire:

direct rendering: Yes

Se compare "no" allora siete sfortunati o avete sbagliato qualcosa.

Se compare "yes" è possibile finalmente abilitare gli effetti grafici: dal menù gnome Sistema->Preferenze->Effetti Desktop abilitare il cubo e le finestre fluttuanti.

Per una gestione più fine delle opzioni compiz, suggerisco di installare il pacchetto gnome-compiz-manager

03 aprile, 2007

Catturiamo il SIGTERM con python

Scrivendo una applicazione a volte è necessario compiere delle operazioni di "pulizia" prima che questa venga chiusa. A volte è necessario compierle anche se l'applicazione viene uccisa con kill.

Il comando kill

Il comando Kill serve per inviare dei segnali ad un processo. Utilizzato senza opzioni e con parametro un pid di un processo (che possiamo trovare utilizzando il comando ps), kill invia a tale processo il segnale SIGTERM che in genere indica al processo di terminare le sue operazioni. Esistono molti altri segnali ma in questo post ci occuperemo solo del SIGTERM.

Il modulo signal

Per la gestione dei segnali python mette a disposizione il modulo signal. Una delle funzioni più importanti presenti in questo modulo è la signal(). Questa funzione permette di registrare un handler per un particolare segnale.

Esempio


import signal
import sys
import time

def sigterm_handler(signum, frame):
print "SIGTERM catturato"
sys.exit(0)

signal.signal(signal.SIGTERM, sigterm_handler)

while (1):
sys.stdout.write(".")
sys.stdout.flush()
time.sleep(1)

Questo esempio continua a stampare "." fin quando non cattura il segnale SIGTERM inviato con una kill pid. A questo punto stampa il messaggio che indica che il segnale è stato catturato ed esce

29 marzo, 2007

Problemi di rete :(

Si lo so che è da un bel po che non posto ma purtroppo ho problemi con l'Adsl. Sto cambiando gestore e sto aspettando la nuova rete. Intanto mi connetto solo saltuariamente quando posso. Vi aggiornerò presto con le novità su planimo e i soliti suggerimenti su python e tutto il resto non appena possibile.

19 marzo, 2007

Tip: mitico vim!

Ogni tanto durante l'uso quotidiano di vim scopro qualcosa di nuovo e molto utile (specie per noi programmatori ;) )

Se siete programmatori anche occasionali ed utilizzate vim per editare i vostri programmi vi sarà sicuramente capitato di imbattervi in errori di compilazione (se no vi adorerò come un dio :) ).

Bene questi errori di solito vengono stampati sul terminale accompagnati da un numero di linea che rappresenta il punto dove si è verificato l'errore.

Vim mette a disposzione un paio di metodi molto comodi per spostarsi automaticamente ad una certa riga:

Primo metodo

vim +50 nomefile.py


Questo metodo lancia l'editor vim con come buffer il file nomefile.py e fa si che il cursore si sposti essattemente alla riga 50.

Secondo metodo

Se invece avete già una istanza di vim attiva e state editando il file interessato basta digitare in modalità comandi:

:50

Questo comando posizionerà il cursore alla cinquantesima riga.

In questo modo diventerà più veloce risolvere i problemi!

11 marzo, 2007

Una classe per le notifiche con python e dbus

Ogni tanto trovo un minuto per migliorare il mio progetto planimo ed imparo qualcosa di nuovo su python e le varie estensioni. In un prossimo post vi annuncerò le grandi novità del progetto ma per ora vi voglio presentare un metodo semplice per far apparire le notifiche sul nostro desktop (solo unixes, no Windows). La notifica sarà simile a questa:


La notifica apparirà in basso a destra sul desktop per un periodo di tempo impostabile.
Dbus è un sistema per la comunicazione tra processi. In pratica si sfrutterà dbus per comunicare con il demone delle notifiche.

Il codice python



import dbus

ICON = "file:///home/redgun/python/planimo/data/icons/planimo48.png"

class Notifier:
def __init__(self):
self.session_bus = dbus.SessionBus()
obj = self.session_bus.get_object("org.freedesktop.Notifications",
"/org/freedesktop/Notifications")
self.notif = dbus.Interface(obj, "org.freedesktop.Notifications")

def notify(self, title, message, iconfile = ICON, time = 3000):
try:
self.notif.Notify("Notification",
dbus.UInt32(0), iconfile, title, message,
[], [], dbus.Int32(time), dbus.UInt32(0))
except:
try:
self.notif.Notify("Notification",
dbus.UInt32(0), iconfile, title, message,
[], [], dbus.Int32(time))
except Exception, detail:
print detail

if __name__ == "__main__":
n = Notifier()
n.notify("Titolo", "messaggio stile bold", time=5000)


Per far funzionare questo codice è necessario che il pacchetto python-dbus sia installato sul vostro sistema (Ubuntu lo installa per default). Il metodo notify prova ad invocare il metodo self.notif.Notify in due modi diversi a causa di una modifica delle api della libnotify (vedi qui per maggiori info). Il primo metodo infatti funziona su Ubuntu Edgy, il secondo sulla Feisty. Il parametro time server per impostare la durata in millisecondi della notifica.

07 marzo, 2007

Comunicazioni sicure: Il tunnell ssh e l'X Forwarding

Molte applicazioni che utilizzano il protocollo TCP per le connessioni, possono essere canalizzate in un tunnel sicuro grazie all'ausilio di OpenSSH.
Ciò significa che tutto il traffico di rete generato da queste applicazioni verrà crittografato e quindi reso sicuro dagli strumenti di OpenSSH. Affinché ciò sia possibile è necessario che sull'host remoto sia in esecuzione il servizio ssh. Su ubuntu basta installare il pacchetto openss-server.

Esempi di connessioni che possono essere canalizzate sono http, smtp, pop3 ed in particolare le connessioni agli X servers.


Esempi

Connessione sicura ad un server di database postgresql

Per default il servizio postgre è in ascolto sulla porta 5432. Supponiamo che il servizio risieda sull'host pippo e che l'utente tizio abbia un account sulla macchina pippo.
Allora è possibile creare un tunnel sicuro in questo modo:

$ ssh -L 5500:pippo:5432 tizio@pippo
$ psql -h localhost -p 5500 utente_postgres

Il primo comando crea il tunnell ssh associando la porta remota 5432 alla porta locale (scelta da noi a piacimento) 5500 utilizzando l'account tizio per effettuare il login sulla macchina pippo. A questo punto si usa il secondo comando per connettersi alla estremità locale del tunnell. psql è il client testuale fornito con l'installazione di postgreSQL.

Connessione remota e X Forwarding

Un altro uso molto utile del tunnell ssh è l'X Forwarding.
L'X Forwarding è un meccanismo che permette di visualizzare una applicazione grafica eseguita su un server remoto, in locale. Per abilitarlo è necessario utilizzare l'opzione -X per ssh. Ad esempio:

$ ssh -X tizio@pippo
$ firefox

Il primo comando ci permette di loggarci sull'host pippo tramite l'account tizio abilitando l'X Forwarding. Il secondo comando lancia il browser firefox che sarà eseguito sull'host pippo ma apparirà sul nostro display come se lo avessimo eseguito in locale.
Attenzione che l'opzione ForwardX11 non sia impostata a no nel file di configurazione del demone ssh sul server remoto (/etc/ssh/ssh_config) altrimenti l'X Forwarding non funzionerà!

03 marzo, 2007

Condividere la connesione ad internet con linux

In molti mi chiedono come si fa a condividere la connessione internet del proprio pc linux con altri computer sulla rete locale. L'operazione non è complessa. Si possono scegliere più strade diverse:

1) Installare firestarter un tool per la gestione del firewell che ha tra le sue impostazioni una opzione per condividere la connessione ad internet

2) Procedere manulamente con i tools messi a disposizione dalla distribuzione.

Io sconsiglio la prima soluzione perché si impara poco ed inoltre installare un intero programma solo per condividere la connessione ad internet non è molto conveniente.

Procediamo quindi per la seconda via. Supponiamo che il nostro pc che è connesso ad
internet abbia due interfacce di rete (o comunque una interfaccia ethernet ed una interfaccia PPP che rappresenta la connessione ad internet): la prima eth0 connessa ad internet e la seconda eth1 connessa alla rete locale. Consideriamo sulla eth1 un indirizzo ip 192.168.100.1. (Per impostare questo indirizzo basta usare il comando

$ sudo ifconfig eth1 192.168.100.1 up

)

Per condividere la connessione ad internet è necessario abilitare il forwarding ed il masquerading sull'interfaccia di rete in questo modo:


$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

Naturalmente eth0 va sostituito con il nome dell'interfaccia connessa ad internet.
Ora non resta che aggiungere alla tabella di routing dei clients (gli altri pc della rete che devono accedere ad internet tramite la connessione del computer che abbiamo appena configurato) come default gateway il pc connesso a interntet. Per farlo bisogna usare
i seguenti comandi:

$ sudo ifconfig eth0 192.168.100.x
$ sudo route add default gw 192.168.100.1

Il primo comando assegna un indirizzo ip alla scheda di rete (sostituite la x con un numero diverso su ogni client). Il secondo aggiunge alla tabella di routing l'indirizzo del server come gateway.
Naturalemte i valori potete sostituirli con quelli della vostra rete ;)
Rimane ora solo da aggiungere sui clients gli ip dei server DNS. Potete usare quelli
che ci sono sul server e aggiungerli al file /etc/resolv.conf

28 febbraio, 2007

I comandi ls

In linux il comando ls mostra il contenuto di una directory. Esistono una serie di comandi ls (list) che in genere mostrano una lista di qualcosa.

lshw (list hardware) mostra una lista dettagliata di tutto l'hardware presente sulla nostra macchina, dal processore alle porte usb alla memoria ram etc


lsusb (list usb) mostra un elenco delle porte usb (più precisamente dei bus usb) del nostro pc con le eventuali periferiche connesse

lspci similmente ad lsusb, mostra un elenco delle periferiche pci

lspcmcia se si ha a disposizione una porta pcmcia (in genere sui portatile è presente)
mostra un elenco delle periferiche connesse a tale porta

lsmod mostra l'elenco dei moduli del kernel che sono attualmente caricati

lspcmcia e lsusb sono molto comodi per capire se una particolare periferica è stata "riconosciuta" dal sistema operativo. Naturalmente il fatto che sia "vista" da linux non significa che sia pronta all'uso. Infatti è necessario che nel nostro sistema operativo sia presente un driver adatto alla perifericha e che sia stato correttamente caricato!

24 febbraio, 2007

ssh: autenticazione tramite chiave pubblica

ssh (secure shell) offre vari metodi di autenticazione. La classica è quella via password ma se siete stanchi di dover immettere ogni volta che vi loggate in remoto la vostra password, un altro metodo esiste ed è pure preferibile: l'autenticazione a chiave pubblica.

In pratica basta generare una propria chiave pubblica da inserire sull'host remoto nella lista delle chiavi autorizzate ad effettuare il login.

Per generare la propria chiave pubblica basta utilizzare il comando

ssh-keygen

Questo comando genererà i due files id_rsa.pub e id_rsa nella directory .ssh nella nostra home. A questo punto basta loggarsi tramite ssh in remoto e creare il file

.ssh/authorized_keys

nella nostra home remota. In questo file bisogna copiare (o aggiungere) il contenuto del file id_rsa.pub

A questo punto possiamo loggarci senza dover inserire la password :)

19 febbraio, 2007

Vim Marks

Tra le infinite funzioni dell'editor vim ce n'è una molto interessante e comoda: i marks. In pratica vim permette di impostare dei marks in delle particolari posizioni richiamabili in modo semplice.

Per impostare un mark quando si è in modalità normale (non insert) basta premere la combinazione di tasti m seguito da una lettera scelta da noi (che rappresenta il nome del mark). Per richiamare la posizione marcata basta utilizzare la combinazione ' seguita dal nome del mark.

Esempio:

ma - imposta un mark nella posizione corrente con nome a.
'a - richiama il mark e sposta il cursore sulla riga marcata.

15 febbraio, 2007

Codecs proprietari

Ieri a causa di un ripartizionamento del disco e di un errore durante il processo :( ho dovuto reinstallare la mia Ubuntu e ho scoperto un nuovo repository per installare i codecs proprietari (quelli per leggere i formati windows)

Ecco come aggiungerlo:


wget -q http://medibuntu.sos-sts.com/repo/medibuntu-key.gpg -O- | sudo apt-key add -


sudo wget http://medibuntu.sos-sts.com/sources.list.d/edgy.list
-O /etc/apt/sources.list.d/medibuntu.list

Il primo comando aggiunge la chiave gpg per controllare l'autenticità dei pacchetti, mentre il secondo aggiunge il repository.(Attenzione: il secondo comando va
digitato su una sola riga. L'ho spezzato su due per ragioni di layout)

A questo punto basta un

sudo apt-get update

sudo apt-get install w32codecs

Il repository in questione mette a disposizione anche software come skype e googleearth

12 febbraio, 2007

Scaricare i video da YouTube

Oggi mi sono imbattuto in uno script python interessante. Questo script permette di scaricare in modo semplice e voloce i video da youtube senza dover installare nessuna estensione firefox o usare altri programmi impegnativi.
Il programmino può essere scaricato da qui http://www.arrakis.es/~rggi3/youtube-dl/

Per usarlo basta invocarlo da console con per parametro l'url della pagina nella quale è presente il video che vogliamo scaricare :)

Piccolo, semplice, efficace :D

08 febbraio, 2007

Da mp3 a wav e da wav ad mp3

In un precedente post vi avevo spiegato come convertire files da mp3 a wav utilizzando una pipeline gstreamer. Oggi ho scoperto un metodo molto più pratico: lame. Questo tool infatti non solo comprime i file wav in mp3 ma permette di effettuare anche l'operazione inversa. Vediamo come fare:
Prima di tutto installiamo lame se non lo abbiamo già fatto, con:

sudo apt-get install lame

Quindi per convertire i files da wav in mp3 basta dare:

lame nomedelfile.wav


per l'operazione inversa:

lame --decode nomefile.mp3

05 febbraio, 2007

Ubuntu Feisty herd3

Vi annuncio (anche se con due giorni di ritardo :( ) che è stata rilascia la nuova relase di test di Ubuntu Feisty. Purtroppo non ho avuto modo di testarla in quanto la iso alternate su vmware si è pianta poco dopo l'avvio dell'installazione e provando ad aggiornare una virtual machine con su la versione edgy, dopo l'aggiornamento questa non ha più voluto saperne di partire (si che su questa virtual machine avevo una configurazione con partizioni lvm ...).
Quindi vi posso solo riassumere ciò che si legge in giro. Tra le novità c'è il nuovo pannello di controllo di gnome (criticato da alcuni... a vederlo non sembra malaccio, bisogna però provarlo), l'integrazione di tracker per le ricerche sul file sistem, un metodo semplice per installare i codecs proprietari, Network Manager integrato ed installato di default nel sistema. Insomma le novità sembrano succulente :)
Aspettiamo con ansia la release finale.

Per testarla come al solito trovate le iso su http://cdimage.ubuntu.com

03 febbraio, 2007

LaTeX e i caratteri accentati

Finalmente mi sono deciso: sto imparando LaTeX. Io e i word processor come Microsoft Word o OpenOffice Writer non siamo mai andati molto d'accordo. Ho un intimo bisogno che il pc segua le regole che io gli impongo e questi programmi di solito hanno la tendenza e la presunzione di lavorare secondo delle proprie filosofie che spesso non condivido. Così dopo qualche esitazione mi son deciso ad affrontare il mostro (che poi per fortuna tanto mostro non è, anzi ...).

Uno dei primi problemi che mi son trovato ad affrontare sono le lettere accentate (le simpatiche è é ò ù ì à etc) E si perché LaTeX se non gli si da qualche dritta non sa come gestirle (o meglio le gestisce ma bisogna usare cose del tipo \`e per fare una è).

In rete si trovano vari tutorial per principianti (anche in italiano) ma purtroppo quelli che ho trovato io non tengono in considerazione che la maggior parte dei sistemi operativi moderni seri, usa la codifica utf-8 per i file di testo, che a differenza della codifica ASCII, utilizza due bytes per rappresentare un carattere e non uno. Il succo del discorso è che le soluzioni proposte nei tutorials per far "piacere" i fatidici caratteri a LaTeX non funzionano.

Vi posto qui la soluzione funzionante sulla mia ubuntu edgy:


\documentclass[12pt,a4paper,oneside,italian]{book}


\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}

\begin{document}

Adesso possiamo usare tutti i caratteri accentati
èéòàìù

\end{document}
Salvate il file ad esempio come test.tex, compilate con latex test.tex ed ecco le vostre lettere accentate felicemente stampate sul file dvi :)
P.S. Imparate LaTeX se dovete scrivere qualcosa di serio, non ve ne pentirete!

01 febbraio, 2007

Vim Tabs

Sapevate che vim (il mio editor preferito :) ) nella versione 7.0 permette di utilizzare i tab come in molte altre applicazioni? Io l'ho scoperto da poco. Vi riporto alcuni comandi utili.

Creare una nuova tab
:tabnew [nometab]

Selezione tabs
Mentre si e in modalitò normale (no insert) la combinazione

  • gt (selezione la tab successiva)
  • gT (seleziona la tab precedente)
  • CTRL+PgUp (tab precedente)
  • CTRL+PgDown (tab successiva)
Gli ultimi due non funzionano se abbiamo più schede aperte nel terminale gnome in quanto le combinazioni vengono "catturate dal terminale" e non arrivano a vim.

Chiuedere una tab
:tabc (chiude la tab corrente)

Per maggiori info vi rimando alla documentazione di vim per le tabs

:help tabs

Personalmente non so ancora se perderò le mie classiche abitudini ed userò le tabs ma non si sa mai ;)

29 gennaio, 2007

Demoni in python

In questo post voglio proporvi un metodo più o meno standard per scrivere processi demoni in python. Un processo demone (per chi non lo sapesse), è un processo che di solito è in esecuzione nel sistema per fornire dei servizi su richiesta all'utente o ad altri processi. Il metodo standard per demonizzare un processo, consiste nell'usare due fork (si legge in giro che due fork garantiscono la correttezza del funzionamento su tutti i sistemi unix). La fork è una chiamata di sistema unix che crea in memoria una copia esatta del processo chiamante e restituisce il pid (process id) del nuovo processo al "genitore" e zero al figlio. Andiamo a vedere il codice:


import os
import sys

class Log:
def __init__(self, logfile):
self.logfile = logfile

def write(self, data):
self.logfile.write(data)
self.logfile.flush()

def daemonize(logfile):
"""
Questa funzione fara' diventare demone il processo che la richiamera'
e redirigera' il suo standard output e standard error sul file logfile
"""
# La maschera' con la quale verranno creati gli eventuali nuovi
# files
UMASK = 0

try:
pid = os.fork()
except OSError, e:
raise Exception, "la prima fork e' fallita: %d (%s)" % \
(e.errno, e.strerror)

if (pid == 0):
os.setsid()
try:
pid = os.fork()
except OSError, e:
raise Exception, "la seconda fork e' fallita: %d (%s)" % \
(e.errno, e.strerror)

if (pid == 0):
os.chdir('/')
os.umask(UMASK)
else:
os._exit(0)
else:
os._exit(0)

sys.stdin.close()
# Redirigo standard output ed error sul log file
try:
sys.stdout = sys.stderr = Log(open(logfile, 'a+'))
except IOError, details:
raise IOError, details

return 0

Un paio di punti da notare:
  • Il secondo figlio imposta come sua directory corrente la root ("/")
  • Lo stdin viene chiuso

Per quanto riguarda il primo punto, ciò viene fatto per prevenire situazioni anomale nelle quali un filesystem non può essere smontato in quanto c'è un processo che lo impedisce. Infatti avrete notato che se apriamo una shell e ci spostiamo con il comando cd in una directory sotto un filesystem montato quest'ultimo non potrà essere smontato finché la nostra shell non "smette" di impegnarlo. Il secondo punto è un po più ovvio: un demone non deve ricevere dati dallo standard input. Probabilmente se dovrà ricevere dati userà metodi differenti, come ad esempio i sockets.

Esempio d'uso


Possiamo salvare il codice appena visto in un modulo python che chiamiamo ad esempio daemon.py per poi richiamarlo in questo modo:

from daemon import daemonize

daemonize("/var/log/mylog.log")

import time
i = 0
while 1:
print i
time.sleep(1)
i = i + 1

Se salviamo questo semplice script in, ad esempio, test.py e lo eseguiamo (da root se vogliamo usare /var/log/mylog.log oppure possiamo cambiare file di log e usare un percorso scrivibile dall'utente non privilegiato, ad esempio la nostra home), quello che otterremo sarà un bel demone in esecuzione in background che ogni secondo andrà a scrivere sul nostro file di log il valore della variabile i. Il demone rimarrà in esecuzione fin quando non lo andremo a uccidere. Per farlo dobbiamo scoprire il suo pid con ps x (l'opzione x è necessaria per vedere i parametri passati ai processi), troviamo qualcosa di simile a 65100 python test.py e lo uccidiamo con kill 65100 (sostituire 65100 con il vostro pid.