LinuxDay 2013

Ebbene sì, anche quest’anno parteciperò all’organizzazione del LinuxDay. Questa volta, cercando di essere meno talebano, presenterò una pratica che per molti può essere scontata, ma che forse tanto scontata non è. Cercherò di rispondere alle domande:

  1. Come posso collaborare ad un progetto Open Source?
  2. Voglio creare un progetto Open Source.  Da dove parto?

Partirò da esperienze personali che mi hanno coninvolto come collaboratore e come sviluppatore. Se questo argomento può suscitare curiosità, ti aspetto Sabato 26 Ottobre al Centro Giovani di San Benedetto del Tr.

ld13

La (mia) migliore offerta

In questi giorni nei cinema è in programmazione il nuovo film di Tornatore “The best offer” – La migliore offerta (Trailer)

migliore

Virgil Oldman é un genio eccentrico, esperto d’arte, apprezzato e conosciuto in tutto il mondo. La sua vita scorre al riparo dai sentimenti, fin quando una donna misteriosa lo invita nella sua villa per effettuare una valutazione. Sarà l’inizio di un rapporto che scovolgerà per sempre la sua vita.

Nel cast oltre Geoffrey Rush, Jim Sturgess, Sylvia Hoeks, Donald Sutherland, Maximilian Dirr in qualche modo c’è finito anche il sottoscritto, attraverso l’azienda per la quale lavoro (inim.biz).

In una scena nel film, infatti, fa la comparsa un progetto sviluppato da me: Evolution, una tastiera domotica multimediale. Il progetto è basato su sistema operativo GNU/Linux e l’interfaccia grafica sul framework Qt.

Di seguito una piccolissima parte della scena di riferimento (al minuto 2:12), dove Evolution è installata a protezione del caveau.

Una piccola, grande soddisfazione personale e dell’azienda per cui lavoro.

Corso inglese gratuito con Python

Con la scusa di iniziare ad apprendere Python ho realizzato un piccolo script per fare download automatico delle lezioni di eslpod.com (categoria “English cafe“).

#!/usr/bin/env python
#title           :eslpod_EC.py
#description     :This script downloads english cafe lesson from eslpod.com
#author          :Simone Vellei <henomis@gmail.com>
#date            :20120420
#version         :0.1
#usage           :python eslpod_EC.py
#notes           :
#python_version  :2.6.6
#==============================================================================

import sys
import re
import signal, os
import urllib
from subprocess import call

def wprint(a):
        sys.stdout.write(a)

def handler(signum, frame):
        print "Interrupted!"
        exit(1)

signal.signal(signal.SIGINT, handler)

f = urllib.urlopen("http://www.eslpod.com/website/show_all.php?cat_id=-39570")
s = f.read()
f.close()

if s:
        wprint("Parsing HTML...")
else:
        print "Error: download failed!"

chunk = re.match(r'.*<span class="pod_body">.*<b>([0-9]+)</b>&nbsp;Podcasts&nbsp;&nbsp;&nbsp;',s , re.M|re.S)

lenght = 0

if chunk:
        print "DONE"
        files = chunk.group(1)
        lenght = len(files)
        print lenght
else:
        print "ERROR!"
        exit(1)

# skip lesson 0
for i in range(int(files)-1):
        # insert padding
        s = 'wget "http://libsyn.com/media/eslpod/EC{0}.mp3" -c -O lesson_{1:0%d}.mp3'%lenght
        # format string
        s = s.format(i+1,i+1)
        # go, go, go...
        call(s, shell = True)

Lo script può essere lanciato settimanalmente (qualcuno ha detto cron?! :)) per aggiornare la directory con le nuove lezioni (wget -c farà il lavoro sporco). La prossima versione potrebbe supportare i thread per fare un download multiplo parallelo e il parsing dei parametri in input per nuove funzionalità.

dochroot: automate chroot environment

Esisteranno sicuramente altri modi per fare ciò che sto per descrivere, ma a me occorreva urgentemente perciò ho fatto prima a svilupparlo che a cercarlo.

La necessità di oggi era di creare qualcosa di automatico che potesse, dato un eseguibile, creare un ambiente chroot idoneo per farlo girare. Di solito faccio tutto a mano, copio eseguibile, risolvo dipendenze di librerie, monto i filesystem, ecc.

dochroot fa questo e altro in automatico.

$ dochroot

usage: dochroot options

This script setup chroot environment

OPTIONS:
   -h      		Show this message
   -c <chroot path>	Specify chroot environment path (default /tmp/chroot)
   -a <binary path>	Add executable to chroot environment (default /tmp/chroot)
   -d 			Delete chroot environment (default /tmp/chroot)
   -b			Bind filesystem (/sys, /proc, /dev) WARNING!! Only one bind per environment!

Ipotizziamo di voler avere una shell in chroot con ls e ifconfig, ecco come fare con dochroot:

$ dochroot -c /tmp/mychroot -a /bin/bash
Preparing environment...DONE
Copying files...DONE

La prima operazione di add inizializza anche la directory di chroot, quindi copia l’eseguibile di bash nel percorso opportuno.

$ dochroot -c /tmp/mychroot -a /bin/ls
Preparing environment...DONE
Copying files...DONE
$ dochroot -c /tmp/mychroot -a /sbin/ifconfig
Preparing environment...DONE
Copying files...DONE

Copia anche ls e ifconfig

$ dochroot -c /tmp/mychroot -b
Binding filesystems......DONE

L’operazione di bind richiederà permessi root (ottenuti tramite sudo).

Ora si è pronti per utilizzare l’ambiente appena creato:

$ sudo chroot /tmp/mychroot
bash-4.1# ls /dev
.....

Il progetto è reperibile su Gitorious: http://gitorious.org/dochroot/dochroot

Il semino libero #2

Continuo con la seconda puntata del semino libero con alcune piccole chicche:

Modificare etichetta hard disk usb esterno

Quando si acquista un HD usb esterno di solito si ha a che fare con etichette esotiche e ci si ritrova con un mount point davvero fastidioso da trattare. Una delle possibili soluzioni è quella di intervenire sull’etichetta della partizione in questo modo:

$ sudo e2label /dev/sdg1 mia_etichetta

Ovviamente il filesystem sulla partizione deve essere di tipo ext*.

Mentre pensavo di scrivere questo suggerimento sul blog mi sono chiesto in quale pacchetto fosse incluso il binario e2label. Ecco quindi la seconda chicca:

Cercare in quale pacchetto è contenuto un binario eseguibile

$ dpkg -S `which e2label`
$ e2fsprogs: /sbin/e2label

quindi il pacchetto da installare (se già non lo avete fatto) è e2fsprogs. Ma come fare per sapere se è già installato? Ci sono varie soluzioni anche in questo caso, quella che propongo è:

$ dpkg --get-selections | grep e2fsprogs
$ e2fsprogs         install

se vogliamo fare i puntigliosi ed avere la prova del 9 che dpkg non sbagli possiamo verificare tutto con il comando:

$ dpkg -L e2fsprogs | grep e2label
$ /sbin/e2label

il comando elenca i file contenuti nel pacchetto e ne filtra il risultato.

Alla prossima!

Il semino libero #1

Apro la rubrica del semino libero, piccole chicche di utilità personale che potrebbero far gola anche ad altri…quindi le condivido.
Perché semino? Perché spero di piantare qualcosa che poi cresca…
Perché libero? Perché tratterà di Software Libero.

Rimuovere fingerprints ssh scaduti

Ogni volta che ci si connette via ssh ad un server viene verificata la copia locale del fingerprint (~/.ssh/known_hosts) con l’originale remoto. Se le due firme non coincidono viene visualizzato un messaggio simile al seguente:

$ ssh secrethost
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!        @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
[...]
Offending key in /home/ccm/.ssh/known_hosts:46
[...]
Host key verification failed.

Occorre fare attenzione perché, o il fingerprint è scaduto, oppure è stato violato e manipolato (in realtà c’è un terzo caso e cioè quando si forza sshd a ricreare le chiavi di inizializzazione) . Nel caso in cui il fingerprint sia scaduto o comunque ci siamo accertati che il server non si stato compromesso possiamo utilizzare il comando

$ ssh-keygen -R secrethost

e verrà rimosso dalla copia locale il vecchio fingerprint.

Cambiare l’endianess di un file

Per cambiare l’endianness di un file (es. binario) in Unix ci sono principalmente due modalità una manuale e una automatica. La manuale è swab() che si usa così (man 3 swab):

#include <unistd.h>

void swab(const void *from, void *to, ssize_t n);

L’implementazione che permette di leggere un file e usare swab() è lasciata come esercizio al lettore. 🙂

La modalità automatica invece usa dd in questo modo:

$ dd if=flash.bin of=flashsw.bin conv=swab

Per questa puntata è tutto, alla prossima!