Elke dag de nieuwste Dilbert met Ruby
Eerst even mijn excuus om een tijd niet te bloggen: druk, druk, druk… Heel erg druk! Silverware komt steeds dichter bij de lanceerdatum, wat natuurlijk erg leuk is, maar ook de nodige stress oplevert.
Ineens komen er allerlei bugs naar voren, blijken bepaalde algoritmes inefficiënter te zijn dan gedacht of zelfs niet te werken en gaat er natuurlijk van alles mis (dingen als een een SVN die crasht)…
Daarom heb ik al een week eigenlijk bijna geen enkele blogpost meer gelezen, wat ook te zien is aan het aantal ongelezen items in Bloglines en kom ik er ook niet echt aan toe om zelf wat te schrijven.
Wel heb ik veel code geschreven de afgelopen week, waaronder een stukje Ruby wat ik hier even wil delen.
Het originele script had een ander doeleinde en is ook iets aangepast (daar zat onder andere HTTP-authenticatie in) hiervoor, maar het doel blijft ongeveer hetzelfde. Overigens is dit ook prima op te lossen met bijvoorbeeld wget, maar dit is platformonafhankelijk (mits Ruby geïnstalleerd is) en het was best leuk om te doen.
Wat dit script doet is het volgende:
- Het haalt de Dilbert-strip (in ons voorbeeld) van vandaag op.
- De strip wordt op een FTP geplaatst, bijvoorbeeld voor weergave op een website.
- De huidige datum wordt in de bestandsnaam gezet, zo kun je een archief opbouwen.
Dit script kun je bijvoorbeeld inzetten als je geen beschikking hebt over PHP, maar wel elke dag de nieuwste Dilbert op je site wil plaatsen. In dit geval is het echter verstandig om een “statische” filename te nemen, waarbij je het vorige bestand eventueel zou kunnen hernoemen.
De code:
require 'net/http'
require 'net/ftp'
#een tijdelijk path om de dilbert op te slaan
imagepath = "/tmp/"
#de bestandsnaam voor het tijdelijke path en de FTP
imagefile = "dilbert-" + Time.now.localtime.strftime("%Y-%m-%d") + ".jpg"
#het adres van de website, gebruik hierbij geen http:// of een / aan het einde
httpaddress = "pag.csail.mit.edu"
#de bestandsnaam van het bestand op de http
httpimage = "/~adonovan/dilbert/today.gif"
#ftpinformatie
ftpaddress = "ftp.example.org"
ftpuser = "username"
ftppass = "password"
ftpdir = "dilbert"
fullpath = imagepath + imagefile
#maak een verbinding met de HTTP op port 80, haal de inhoud uit de image en schrijf het weg naar ons tijdelijk bestand
Net::HTTP.start( httpaddress, 80 ) {|http|
req = Net::HTTP::Get.new( '/jpg/image.jpg' )
open( fullpath, "wb").write( http.request( req ).body )
}
#verbind met de FTP, log in en plaats het plaatje in de juiste directory
ftp = Net::FTP::new( ftpaddress )
ftp.login( ftpuser, ftppass )
ftp.chdir( ftpdir )
ftp.putbinaryfile( fullpath, imagefile )
ftp.close
De bovenste variablen dienen voor configuratie (ik ben me bewust van YAML, maar dat vond ik hier wat ver gaan), de rest zou duidelijk moeten zijn als je een beetje Ruby snapt of gewoon simpelweg de comments leest. Echter staan de reacties, zoals altijd, open voor vragen.