Twitter da bash

Usate Twitter e da bravi nerd/geek volete utilizzarlo direttamente da bash? Ecco uno script che usa cURL:

#!/bin/bash
#
# Twitter Update
#
# Requires: cURL http://curl.haxx.se/
# By Guillermo Antonio Amaral Bastidas < gamaral@guillermoamaral.com >
#

### CONFIGURE ###

declare -rx USERNAME="YOUR_USERNAME"
declare -rx PASSWORD="YOUR_PASSWORD"

### DONT MODIFY ###

declare -x STATUS="$@"

curl 'http://twitter.com/statuses/update.xml' \
    -u ${USERNAME}:${PASSWORD} \
    -d "status=${STATUS}" > /dev/null 2> /dev/null

# EOF

Inserite il vostro nome utente e password nelle apposite variabili, rendetelo eseguibile con chmod u+x twitter.sh e usatelo:

./twitter.sh Frase da inviare a twitter

Uso perverso:

PROMPT_COMMAND='/path/di/twitter.sh $(history | tail -n 1)'

così potrete davvero far sapere cosa state facendo in questo momento! (Attenzione: era un geek joke, se lo capite vuol dire che ora di fare una passeggiata fuori).

Weather Wallpaper

Leggendo il blog di nixternal ho scoperto questa giocattolo: weather-wallpaper, un programma scritto in python che cambia automaticamente lo sfondo del desktop per riflettere le condizioni metereologiche attuali. Le istruzioni sul suo sito sono molto chiare, e è possibile scaricare semplicemente il .deb per l’installazione oppure aggiungere il repository dell’autore al proprio sources.list per ricevere automaticamente gli aggiornamenti. Anche se il repository è indicato per Feisty non ho avuto alcun problema nell’installarlo su Kubuntu Gutsy Gibbon 7.10.

Funziona sia su gnome che su KDE, ma ha delle dipendenze da gtk, per cui potrebbe essere non desideratissimo su sistemi che usano KDE come desktop environment e non vogliono “sporcarlo” con applicazioni che non usino solo QT.

Dopo averlo installato e avviato lo si configura indicandogli l’indentificatore ICAO della stazione metereologica più vicina alla città di cui vi interessa il tempo (trovate la lista delle stazioni per l’Italia all’indirizzo http://weather.noaa.gov/cgi-bin/nsd_country_lookup.pl?country=Italy) e lo sfondo verrà automaticamente aggiornato ogni ora.

Ecco un esempio di weather-wallpaper in azione:

Weather wallpaper su Kubuntu 7.10 Gutsy Gibbon

weather-wallpaper: http://mundogeek.net/weather-wallpaper/

Inviare codice su nopaste da shell: pynopaste

Python source code icon by everaldo.comSu IRC c’è spesso bisogno di usare un servizio di nopaste per evitare di inondare il canale di righe e righe di testo. Spesso c’è bisogno di inviare un file completo sul nopaste, così “ispirandomi a” (leggere: “copiando”) nopaste.pl di dfa ho scritto un programma in python che permette di inviare direttamente a http://rafb.net/nopaste il file, o in alternativa quello che riceve dallo stdin.L’unico vantaggio rispetto al programma di dfa è che questo non ha bisogno di installare librerie varie (per la versione in Perl è necessario installare LWP::UserAgent).

L’uso del programma è estremamente semplice:

pynopaste <content> [description]

Invia il file content, il campo description è opzionale e permette di aggiungere la descrizione da mostrare sul nopaste. L’alternativa è inviare il testo tramite stdin, ad esempio:

for i in *.config ; do echo "========== $i ==========" ; cat $i ; done | pynopaste

Questo codice concatena tutti i file con estensione .config nella cartella corrente e lo invia a pynopaste.

Ecco il codice:

#!/usr/bin/python

# pynopaste.pl -- nopaste files from command line
# Copyright (C) 2007, IppatsuMan < ippatsuman * gmail >
#
# *slightly* (yeah, right...) inspired by a work by Davide
# Angelocola ( http://dfa.slackware.it )
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
# USA.

# usage:
#   pynopaste file [description]
#   pynopaste <stdin>

import os, sys, urllib
from urllib2 import Request, urlopen, URLError, HTTPError

if __name__ == "__main__":

	availableext = {
			('pl', 'pm')         : 'Perl',
			('cpp', 'cc', 'hh')  : 'C++',
			('c', 'h')           : 'C',
			('cs')               : 'C#',
			('pas')              : 'Pascal',
			('bas', 'vb')        : 'Visual Basic',
			('java')             : 'Java',
			('py')               : 'Python',
			('rb')               : 'Ruby',
			('sql')              : 'SQL',
			('php')              : 'PHP'}

	desc = ""
	lang = "Plain Text"

	if len(sys.argv)>1:
		try:
			f = open(sys.argv[1])
			lines = f.readlines()
			vext = ""
			f.close()
			# get the file extension
			fileext = os.path.splitext(sys.argv[1])[1][1:].lower()
			for ext in availableext.keys():
				if fileext in ext:
					try:
						lang = availableext[ext]
					except:
						lang = 'Plain Text'
					break
			if len(sys.argv)>2:
				desc = sys.argv[2]
		except IOError, e:
			print e
	else:
		lines = sys.stdin.readlines()

	if len(desc) == 0:
		for line in lines:
			if len(line)>0:
				desc = line
				break

	req = Request("http://rafb.net/paste/paste.php")
	try:
		username = os.environ["LOGNAME"]
	except:
		username = "Anonymous"

	data = urllib.urlencode({"nick" : username[:30], "text" : "".join(lines), "desc" : desc[:50], "lang" : lang})

	try:
		response = urlopen(req, data)
	except HTTPError, e:
		print "HttpError: "+e.code
	except URLError, e:
		print "URLError: "+e.reason
	else:
		resurl = response.geturl()
		if "toofast" in resurl:
			print "Too fast, send again"
		else:
			print resurl

N.B.: non sono affatto un guru di Python (in effetti lo studiacchio nei ritagli di tempo) e non è affatto detto che questo codice sia il modo migliore per realizzare il programma né tanto che sia privo di bug. Se avete appunti di stile lasciate pure un commento :)