Script-Tip: URL auf Existenz prüfen

In unserem heutigen Script-Tip wollen wir euch zeigen wie die Existenz einer URL geprüft werden kann. Dazu wird der Response-Code der angefragten Seite validiert und ein entsprechender boolischer Wert zurückgegeben.

Eine Beispielimplementierung könnte folgendermaßen aussehen:
[ruby]
require ‚open-uri‘
require ’net/http‘

def existiert_url?(url)
url = URI.parse(url)
begin
Net::HTTP.start(url.host, url.port) do |http|
# An dieser Stelle kann bei Bedarf auch auf
# andere Response-Codes geprüft werden
return http.head(url.request_uri).code == "200"
end
rescue SocketError => se
# Fehlerbehandlung, wenn die Domain nicht existiert
# Je nach Applikation kann hier die entsprechende Aktion durchgeführt werden
rescue
# Alle anderen Fehlerfälle werden/können hier behandelt werden
end
end
[/ruby]

 

Danach kann die Existenz einer URL geprüft werden:

[ruby]
existiert_url? "http://www.rubyonrails.de/"
# => true: Die Startseite existiert
existiert_url? "http://www.rubyonrails.de/tag/rails-3/"
# => true: Es gibt eine Unterseite mit Artikeln/Tags zu Rails 3
existiert_url? "http://www.rubyonrails.de/GIBT-ES-NICHT"
# => false: Diese Unterseite existiert nicht
[/ruby]

Script-Tip: Summe eines Arrays ermitteln

Die Summe eines Arrays lässt sich in auf verschiedenste Art und Weise ermitteln. In unserem heutigen Script-Tip wollen wir euch zeigen, welche Möglichkeiten es gibt.

[ruby]
# Das zu summierende Array
mein_array = [1, 8, 5, 3, 10]

# Die offensichtlichste Methode
sum = 0
mein_array.each { |a| sum+=a }

# Eine etwas kürzere Variante
mein_array.inject{|sum,x| sum + x }

# Wie man mit Ruby 1.9 zum Ziel kommt
mein_array.inject(:+)

# Mit der Hilfe von ActiveSupport
require ‚activesupport‘
mein_array.sum

# Oder man erweitert direkt die Array-Klasse um die benötigte Funktion
class Array
def summe
self.inject{|sum,x| sum + x }
end
end

mein_array.summe
[1,2,3,4].summe

[/ruby]

Script-Tip: Hash mit Standardrückgabewert

Wenn bei der Benutzung von Hashes ein Standardwert anstatt von nil zurückgegeben werden soll, gibt es zwei Möglichkeiten wie das erreicht werden kann.

Das normale Verhalten bei einem Hash sieht folgendermaßen aus:

[ruby]
h = Hash.new # eine neue Hashinstanz erzeugen
h[5] # => gibt nil zurück
h[‚mein-index‘] # => gibt auch nil zurück
[/ruby]

Bei der ersten Variante für die Rückgabe von Standardwerten kann über den Konstruktor gelöst werden:

[ruby]
h = Hash.new("DEFAULT_VALUE") # eine neue Hashinstanz erzeugen
h[5] # => gibt "DEFAULT_VALUE" zurück
h[‚mein-index‘] # => gibt auch "DEFAULT_VALUE" zurück
[/ruby]

Die zweite Variante wird über einen Rückgabeblock gelöst:

[ruby]
h = Hash.new {|hash, key| (key.respond_to? :to_str) ? "DEFAULT_VALUE" : nil }
h[5] # => gibt nil zurück
h[‚mein-index‘] # => gibt "DEFAULT_VALUE" zurück
[/ruby]

Die beiden Varianten unterscheiden sich dadurch, dass nur bei fehlenden String-Indixes der Statndardwert zurückgegeben wird.

Script-Tip: Kopierten Text in Vim einfügen

Vim ist ein mächtiger Editor der von vielen in der Software-Entwicklung eingesetzt wird. Es gibt viele Plugins und vim-Scripte die einen Entwickler bei der Arbeit unterstützen. Jedoch ist Vim bei der automatischen Einrückung manchmal zu „hilfreich“ und formatiert eingefügten Text nicht immer so, wie man es erwartet.

Ein kleines Beispiel wie die Einrückung aussehen kann, wenn man folgenden Text per Copy&Paste einfügt:
Zu kopierender Text:
[ruby]
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
[/ruby]

Mögliches Ergebnis nach dem Einfügen:
[ruby]
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
[/ruby]
Jedoch lässt sich dieses Verhalten anpassen, damit man zum gewünschten Ergbnis kommt.
Im Kommandomodus einfach folgende Konfig setzten:
[text]
:set paste
[/text]

Danach den gewünschten Text einfügen und ggf. die Einstellung wieder zurücksetzen:
[text]
:set nopaste
[/text]

Script-Tip: Arrays

In unserem heutigen Script-Tip wollen wir euch zeigen wie man Arrays nach zufälliger Reichenfolge mischt, das Element mit dem größten/kleinsten Wert incl Index raussucht und den Durchschnittswert aller Elemente herausfindet.

Als erstes ein Beispiel wie man die Elemente nach zufälliger Reichenfolge mischen kann:

[ruby]
[1,2,3,4,5,6,7,8,9].shuffle
# => [3, 2, 5, 7, 4, 6, 1, 9, 8]

# Bitte beachtet, dass dies erst ab Ruby Version 1.8.7 unterstützt wird.
# Falls ihr noch mit einer älteren Version arbeitet/arbeiten müsst,
# könnt ihr auch auf andere Weise eure Arrays "mischen"

[1,2,3,4,5,6,7,8,9].sort_by{ rand }
# => [4, 7, 9, 6, 1, 5, 3, 8, 2]
[/ruby]

Nun ein Beispiel wie ihr den größten/kleinsten Wert in einem Array inclusive dem Index herausfinden könnt:

[ruby]
# Ruby bringt bereits alles mit um die gesuchten Werte
# zu ermitteln: min und max

# Den größten Wert incl. Index finden…
[7,5,10,9,6,8].each_with_index.max
# => [10, 2]

# Den kleinsten Wert incl. Index finden…
[7,5,10,9,6,8].each_with_index.min
# => [5, 1]
[/ruby]

Als letzter Arry-Script-Tip noch ein paar Beispiele um den Durchschnittswert eines gesamten Arrays herauszufinden:

[ruby]
arr = [9,8,5,2,8,7]
arr.inject(:+).to_f / arr.size # => 6.5

# oder
arr.instance_eval{inject(&:+).to_f / length}

# oder
arr.inject{ |r, x| r + x }.to_f / arr.size

# oder
arr.inject(0.0){ |r, x| r + x } / arr.size

# oder
class Array
def gesamt
inject(0.0) { |erg, el| erg + el }
end

def durchschnitt
gesamt / size
end
end

arr.durchschnitt
[/ruby]

Dateien auf Amazon S3 speichern

Amazon Simple Storage Service (Amazon S3) ist eine günstige möglichkeit Dateien in (fast) beliegiger Größe zu speichern. Im heutigen Script-Tip wollen wir zeigen wie einfach es ist Daten auf S3 zu speichern.

Um nicht die ganze Funktionlität selber zu implementieren werden wir in dem Beispiel auf das Gem „aws-s3“ zurückgreifen. Um das folgende Beispiel auszuprobieren, wird ein S3-Account für den Dienst benötigt. Der Account kann bei Amazon unter http://aws.amazon.com/s3/ eingerichtet werden.

Installation von aws-s3:

[bash]
gem install aws-s3
[/bash]

Danach kann man ganz einfach seine Dateien auf S3 übertragen.

[ruby]
require ‚rubygems‘
require ‚aws/s3‘
include AWS
include S3

AWS::S3::Base.establish_connection!(
:access_key_id => ‚DIE_AMAZON_ACCESS_KEY_ID‘,
:secret_access_key => ‚DER_AMAZON_SECRET_KEY‘
)

S3Object.store(‚der/objekt/pfad/auf/amazon/test.jpg‘, open(‚test.jpg‘),
‚der.bucket.name‘, :access => :public_read)
[/ruby]

Amazon S3 lässt ich auch für z.B. für Backups verwenden. Das wäre dann aber ein anderer Script-Tip… 🙂

Betriebssystem herausfinden

Hin und wieder ist es erforderlich das Betriebssystem, auf dem die Applikation gerade ausgeführt wird, herauszufinden. Oft wird hierzu die „RUBY_PLATFORM“ dazu benutzt. Wie das folgende Beispiel zeigt, kann dies zu einem „falschen“ Ergenis führen.

RUBY_PLATFORM gibt z.B. bei der Verwendung von JRuby den Wert „java“ zurück. Das spiegelt nicht das Betriebssystem wieder, sondern die verwendete Engine unter der die Applikation läuft.

Ein Beispiel-Modul um das Betriebssystem herauszufinden wäre:

[ruby]
module Betriebssystem
def macintosh?
RUBY_PLATFORM.downcase.include?("darwin")
end

def windows?
RUBY_PLATFORM.downcase.include?("mswin")
end

def linux?
RUBY_PLATFORM.downcase.include?("linux")
end
end
[/ruby]

Um einen verlässlichen Wert zu bekommen, sollte man das Gem „sys-uname“ verwenden. Damit bekommt neben dem Betriebssystem auch viele weitere Informationen über die Umgebung heraus.

Installation von sys-uname:

[bash]
gem install sys-uname
[/bash]

Verwendung von sys-uname:

[ruby]
require ’sys/uname‘
include Sys

puts Uname.nodename
puts Uname.version
puts Uname.sysname
puts Uname.machine
puts Uname.release

p Uname.uname
[/ruby]

Auf diese Weise bekommt alle relevanten Daten die man ggf. benötigt.

Doppelte Einträge filtern

Heute wollen wir euch eine Möglichkeit vorstellen um Datensätze / Arrayelemente von doppelten Einträgen zu befreien.
Um dies zu ermöglichen wird die Array-Klasse um eine weitere Methode erweitert und kann dann in einer beliebigen Ruby/Rails-App benutzt werden.

Dies ist die Erweiterung die benötigt wird.
[ruby]
require ’set‘

class Array
def uniq_by
seen = Set.new
select{ |x| seen.add?( yield( x ) ) }
end
end
[/ruby]

Danach könnt ihr eure Ergebnisse folgendermaßen filtern:

[ruby]
@uniqueposts = Posts.all.uniq_by { |h| h.body }
[/ruby]

Videolänge mit Ruby und ffmpeg herausfinden

Heute wollen wir in unserem Script-Tip zeigen wie man auf Windows-Rechnern die Länge von Videos mit Ruby und ffmpeg herausfinden kann.

Um das Script auszuführen muss ffmpeg auf dem Rechner installiert sein.
Quellcode:
[ruby]
s = `ffmpeg -i x:\dirfile.wmv 2>&1`
if s =~ /Duration: ([d][d]):([d][d]):([d][d]).([d]+)/
hours = $1
mins = $2
seconds =$3
fractions = $4
end
[/ruby]

Shell-Komandos in irb aufrufen

Man muss in einer irb-Session nicht auf die gewohnten Konsolen-Kommandos verzichten. Der heutige Script-Tip zeigt wie ihr eure irb-Session um die Funktionalität von Konsolen-Kommandos erweitern könnt.

Quellcode:

[ruby]
def sys_kommando(name, *args)
system("#{name} #{args.join(‚ ‚)}")
end
[/ruby]