domenica 30 dicembre 2007

L'informatica è una guerra...


.. e questo lo sa chiunque, per motivi vari ed eventuali, si trovi a combattere con una certa frequenza in campo informatico.

In trincea, però, a volte noi soldati abbiamo la fortuna di sentire voci illuminate che indicano chiaramente quale sia la direzione da seguire, quale sia la prossima mossa da effettuare, come limitare i danni: è anche grazie a queste voci che, ogni giorno, si riesce a sopravvivere e ad andare avanti.

La lingua dell'informatica è notoriamente l'inglese, ma da un paio di settimane è possibile udire - chiara e forte - una di queste voci che impiega la lingua del nostro Bel Paese.

Stacktrace.it si auto-definisce "aperiodico di resistenza informatica", ed è un sito che ha come mission la creazione di contenuti originali di elevatissima qualità nell'ambito dell'informatica.

In questi pochi giorni di attività è già emersa la qualità del lavoro del team di Stacktrace.it, composto da professionisti italiani dell'informatica, e gli articoli pubblicati sono interessanti ed originali.

L'idea è ottima, i risultati iniziano già a farsi vedere. Non resta che aggiungere il feed al nostro feed-reader (RSSyl, nel mio caso) e sperare che i ragazzi di Stacktrace.it continuino così!

mercoledì 26 dicembre 2007

Un'occhiata a JavaScript

Personalmente ho sempre considerato JavaScript un linguaggio di seconda categoria (anche di terza, volendo), forse perché non gode di ottima reputazione o forse perché uno dei principali ambiti di applicazione è la creazione di contenuto web dinamico lato client.

Dovendo però utilizzarlo per motivi accademici, oltre che per motivi di lavoro, mi sono deciso a dare uno sguardo un po' più approfondito a questo linguaggio, visto che sono convinto che sia necessario essere in grado di comprendere il funzionamento di un linguaggio per poterlo utilizzare, e che ogni linguaggio di programmazione abbia delle caratteristiche idiomatiche che è necessario conoscere.

Ho trovato davvero ottima l'introduzione al linguaggio JavaScript a cura di Douglas Crockford disponibile su Yahoo! Video.
Crockford è Chief JavaScript Architect in Yahoo!, e questo fornisce un'idea approssimativa della qualità del materiale proposto. Il video è diviso in quattro parti e la durata complessiva è inferiore alle due ore:


L'esposizione è chiara, il discorso scorrevole. È adatto ad un pubblico con nozioni generali di programmazione, che abbia intenzione di capire le differenze tra JavaScript e gli altri linguaggi di programmazione.

Consigliatissimo a tutti coloro debbano scrivere anche solo qualche riga di codice in JavaScript.

domenica 9 dicembre 2007

Una piccola applet personalizzata per il pannello di GNOME


Vi siete mai chiesti quale sia la forza che spinge gli sviluppatori di software libero a continuare a scrivere utili programmi, spesso di elevata qualità?
Ci sono sicuramente tante concause, ma penso che la soddisfazione di un'esigenza personale (gli anglofoni dicono "scratching his own itch") sia uno dei fattori maggiormente rilevanti.

Bene, oggi mi sono tolto una piccola soddisfazione, che voglio condividere con voi: la realizzazione di una piccola e rozza applet per il pannello di GNOME che mostri la qualità del segnale della mia scheda wireless.

So bene che ci sono già delle applicazioni che lo fanno, ma nessuna era semplice come volevo io, nessuna mi dava solo quell'informazione, nessuna mi appagava.

E poi, il bello è proprio questo: ce ne saranno migliaia, ma nessuna è mia! :)

Qui riporto alcuni dei passaggi fondamentali da me seguiti nella realizzazione dell'applet ed il codice sorgente completo della stessa, rilasciata sotto GNU GPL 3.

Prelievo dell'informazione sul segnale
Primo problema: come trovo l'informazione sulla potenza del segnale?
Penso che tutti conoscano l'utility iwconfig, che, tra le altre, fornisce anche l'informazione che cerco, sotto la voce "Link Quality".

Python, tramite il modulo commands, fornisce la possibilità di ottenere l'output di un comando. Vediamo come sfruttarlo:

import commands

interface = "eth2"

def get_signal_strength():
str = commands.getoutput("/sbin/iwconfig " + interface).split("\n")
for row in str:
pos = row.find("Quality=")
if pos > 0:
sig = row.split()[1].split("=")[1]
return sig

return ""

Questa funzione elabora l'output di iwconfig, cercando la riga contenente l'informazione ed estrapolandola. L'output di questa funzione sarà una stringa tipo "49/100", che è proprio quello che andremo a posizionare, rozzamente, nel pannello di GNOME.

Realizzazione di un'applet per il pannello
Perfetto, ora che abbiamo l'informazione che ci serve, dobbiamo solo mostrarla nel pannello ed aggiornare ad intervalli regolari quest'informazione. Come fare?

Fortunatamente esiste un modulo di python, chiamato gnomeapplet, che serve proprio a realizzare applet per il pannello di GNOME. Sotto debian, il pacchetto si chiama python-gnome2-desktop, ed installandolo vi tirerete dietro anche i binding Python per le GTK+ e per GNOME, che sono ovviamente necessari.

A questo punto, vista la solita mancanza di documentazione, non ho fatto altro che andare a spulciare gli esempi di gnomeapplet, ed ho verificato che è necessario, oltre alla scrittura del codice python, realizzare un file per Bonobo (uno dei componenti fondamentali di GNOME) in modo da fargli notare che esiste anche la nostra applet, e visualizzarla così nella finestra "Aggiungi al pannello" che mostra tutte le applet che si possono inserire.

Bando alle ciance, ecco il codice per l'applet vera e propria, wimonitor.py:

import pygtk
pygtk.require('2.0')

import gtk
import gnomeapplet
import gobject
import commands

interface = "eth2"
interval = 1000

def get_signal_strength():
str = commands.getoutput("/sbin/iwconfig " + interface).split("\n")
for row in str:
pos = row.find("Quality=")
if pos > 0:
sig = row.split()[1].split("=")[1]
return sig

return ""

def update_signal(label):
label.set_text(get_signal_strength())
return True

def applet_factory(applet, iid):
label = gtk.Label(get_signal_strength())
applet.add(label)
applet.show_all()
gobject.timeout_add(interval, update_signal, label)
return True

gnomeapplet.bonobo_factory("OAFIID:GNOME_WiMonitor_Factory", gnomeapplet.Applet.__gtype__, "hello", "0", applet_factory)


Ed ecco il codice del file GNOME_WiMonitor.server:

<oaf_info>

<oaf_server iid="OAFIID:GNOME_WiMonitor_Factory" type="exe" location="/home/andrea/wimonitor/wimonitor.py">

<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:Bonobo/GenericFactory:1.0"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="WiMonitor"/>
<oaf_attribute name="description" type="string" value="Semplice monitor del segnale wireless"/>
</oaf_server>

<oaf_server iid="OAFIID:GNOME_WiMonitor" type="factory" location="OAFIID:GNOME_WiMonitor_Factory">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:GNOME/Vertigo/PanelAppletShell:1.0"/>
<item value="IDL:Bonobo/Control:1.0"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="WiMonitor"/>
<oaf_attribute name="description" type="string" value="Semplice monitor del segnale wireless"/>
<oaf_attribute name="panel:category" type="string" value="Utility"/>
<oaf_attribute name="panel:icon" type="string" value="bug-buddy.png"/>
</oaf_server>

</oaf_info>


È necessario modificare l'attributo location del primo tag oaf_server in modo da renderlo coerente con la posizione reale del file wimonitor.py.

Potete posizionare il file wimonitor.py dove preferite, mentre il file GNOME_WiMonitor.server va posizionato in /usr/lib/bonobo/servers.

Configurate l'applet modificando opportunamente i valori delle variabili interface e interval.

Se tutto è andato bene, troverete WiMonitor tra le applet da aggiungere al pannello, ed aggiungendola potrete avere sott'occhio l'andamento del segnale della vostra scheda wireless.

Conclusioni
Effettivamente l'applet è un po' bruttina, non è personalizzabile.. È decisamente migliorabile!
Ma onestamente a me non interessava creare un sexy framework di monitoraggio delle prestazioni di rete, volevo soltanto avere sott'occhio velocemente quell'informazione e dare un'occhiata alla programmazione GNOME in Python.

Spero che questo post sia utile come introduzione a tutti coloro che abbiano voglia anche loro di togliersi uno sfizio del genere.

E ricordate... Python RULEZ!

sabato 8 dicembre 2007

Piccole comodità per SSH


Chiunque amministri o utilizzi da remoto più di una macchina sa bene quanto sia noioso dovere ricordare i dati di queste macchine.
Se si utilizza SSH, è necessario ricordare a memoria almeno indirizzo IP, nome utente e password; se si è sufficientemente paranoici, bisogna ricordare anche la porta su cui SSH ascolta ;)
Bene, è possibile configurare OpenSSH, implementazione di riferimento di SSH presente nella maggioranza delle distribuzioni Linux, in modo da associare un comodo alias a buona parte di questi dati.
Supponiamo che io mi debba connettere alla macchina che risponde all'IP 192.168.1.1, nella quale il server è configurato per ascoltare alla porta 9999, e che il nome utente che voglio utilizzare sia "nomeutentemoltosicuro". Per fare ciò dovrò aggiungere al file /home/mioutente/.ssh/config le seguenti righe:

Host mioalias
Hostname 192.168.1.1
Port 9999
User nomeutentemoltosicuro

In questo modo, digitando "ssh mioalias", ssh utilizzerà per la connessione le impostazioni che abbiamo specificato, chiedendoci solo la password per l'utente "nomemoltosicuro".

Posso inserire diverse impostazioni, ed associare quindi semplici nomi ad insieme di settaggi talvolta difficili da ricordare.

Se vi infastidisce l'inserimento della password, sappiate che esiste un modo per eliminarlo, ma è un procedimento poco sicuro e sconsigliato, utilizzabile senza problemi di sicurezza solo in pochissimi casi. Ecco come fare:

  1. Generare una coppia di chiavi RSA con il comando "ssh-keygen -t rsa"

  2. Quando vi viene chiesta la password, premere INVIO (creando quindi una chiave senza password)

  3. Copiare il file /home/utente/.ssh/id_rsa.pub nella home directory dell'utente remoto del sistema in cui si vuole abilitare il login senza password

  4. Entrare nel nuovo sistema con l'utente che si vuole utilizzare per il login senza password e digitare il seguente comando: "cat ~/id_rsa.pub >> ~/.ssh/authorized_keys"


A questo punto, dovreste essere già in grado di effettuare il login senza password. Notate che siete in grado di farlo perché avete aggiunto la vostra chiave pubblica all'insieme delle chiavi che OpenSSH ritiene sicure per il login, e perché siete in possesso della vostra chiave privata, che è stata creata dal comando "ssh-keygen" ed è stata posizionata in /home/utente/.ssh/id_rsa.
Quest'ultimo file non dovrebbe mai essere reso pubblico, perché il vostro comodo login senza password è disponibile a chiunque sia in possesso di quel file e delle conoscenze per utilizzarlo.

Per altri suggerimenti sull'utilizzo di SSH, compreso l'accesso senza password appena descritto, visitate http://polishlinux.org/apps/ssh-tricks/.